2017-02-09 5 views
5

나는 Keras를 사용하는 LSTM 신경망을 사용하여 Rock-Paper-Scissor 게임에서 상대방의 다음 움직임을 예측하려고합니다.Keras LSTM 훈련 데이터 형식

입력을 Rock : [1 0 0], Paper : [0 1 0], Scissor : [0 0 1]로 인코딩했습니다. 이제 신경망을 훈련하고 싶지만 훈련 데이터의 데이터 구조가 다소 혼란 스럽습니다.

나는 다음과 같은 구조로 .csv 파일에서 상대의 게임 기록을 저장 한

:

1,0,0 
0,1,0 
0,1,0 
0,0,1 
1,0,0 
0,1,0 
0,1,0 
0,0,1 
1,0,0 
0,0,1 

그리고 나는 훈련으로 내 훈련 레이블로 모든 5 데이터 및 이전 4 개 데이터를 사용하는 것을 시도하고있다 입력. 다시 말해, 각 시간 단계에서 치수가 3 인 벡터가 네트워크로 전송되고 4 단계의 시간 간격이 있습니다.

1,0,0 

내 질문이 Keras 'LSTM 네트워크는 데이터 형식의 유형을 받아 들일 않는 것입니다 교육 라벨

예를 들어, 다음은 입력 데이터

1,0,0 
0,1,0 
0,1,0 
0,0,1 

그리고 다섯 번째입니다? 이러한 목적으로 데이터를 재정렬하는 최적의 방법은 무엇입니까? 도움이된다면 내 불완전한 코드는 다음과 같이 연결되어 다음 LSTM에 대한

#usr/bin/python 
from __future__ import print_function 

from keras.models import Sequential 
from keras.layers import Dense, Activation, Dropout 
from keras.layers.recurrent import LSTM 
from keras.optimizers import Adam 

output_dim = 3 
input_dim = 3 
input_length = 4 
batch_size = 20 #use all the data to train in one iteration 


#each input has such strcture 
#Rock: [1 0 0], Paper: [0 1 0], Scissor: [0 0 1] 
#4 inputs (vectors) are sent to the LSTM net and output 1 vector as the prediction 

#incomplete function 
def read_data(): 
    raw_training = np.genfromtxt('training_data.csv',delimiter=',') 




    print(raw_training) 

def createNet(summary=False): 
    print("Start Initialzing Neural Network!") 
    model = Sequential() 
    model.add(LSTM(4,input_dim=input_dim,input_length=input_length, 
      return_sequences=True,activation='softmax')) 
    model.add(Dropout(0.1)) 
    model.add(LSTM(4, 
      return_sequences=True,activation='softmax')) 
    model.add(Dropout(0.1)) 
    model.add(Dense(3,activation='softmax')) 
    model.add(Dropout(0.1)) 
    model.add(Dense(3,activation='softmax')) 
    model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy']) 
    if summary: 
     print(model.summary()) 
    return model 

if __name__=='__main__': 
    createNet(True) 

답변

2

입력 형식은 모양 (sequence_length, input_dim)을 가져야한다. 귀하의 경우, numpy 배열 모양 (4,3) 그것을 수행해야합니다.

그러면 모델에 제공 할 내용은 모양의 수가 적어집니다 (number_of_train_examples, sequence_length, input_dim). 즉, number_of_train_examples 모양의 테이블 (4,3)을 피드합니다. np.array (list_of_train_example)를 수행 한 후

1,0,0 
0,1,0 
0,1,0 
0,0,1 

과 : 은 목록을 작성합니다.

그러나 두 번째 LSTM에 대한 전체 시퀀스를 반환하는 이유를 이해하지 못합니까? 그것은 모양 (4,4)으로 무언가를 출력 할 것이고, Dense 레이어는 아마도 그것에 실패 할 것입니다. 반환 시퀀스는 전체 시퀀스를 반환하므로 LSTM의 각 단계에서 숨겨진 모든 출력을 반환한다는 것을 의미합니다. 두 번째 LSTM이 Dense 레이어에서 읽을 수있는 모양 (4,)의 "요약"벡터 만 얻으려면이 값을 False로 설정합니다. 어쨌든 첫 번째 LSTM의 경우에도 shape (4,3)의 입력을 사용하면 shape (4,4)가있는 무언가를 출력하므로이 레이어의 입력 데이터보다 많은 매개 변수를 가질 수 있습니다. Can 정말 좋을거야.

정품 인증에 대해서도 softmax를 사용하지만 마지막 레이어에서만 softmax를 사용하여 레이어의 출력으로 확률을 얻습니다. 마지막으로 LSTM과 Dense에서 softmax를 사용하는 것은 실제로 의미가 없습니다. "sigmoid"또는 "tanh"와 같은 다른 비선형 성을 찾으십시오.

내가 모델 현명한

def createNet(summary=False): 
    print("Start Initialzing Neural Network!") 
    model = Sequential() 
    model.add(LSTM(4,input_dim=input_dim,input_length=input_length, 
      return_sequences=True,activation='tanh')) 
    model.add(Dropout(0.1)) 
    # output shape : (4,4) 
    model.add(LSTM(4, 
      return_sequences=False,activation='tanh')) 
    model.add(Dropout(0.1)) 
    # output shape : (4,) 
    model.add(Dense(3,activation='tanh')) 
    model.add(Dropout(0.1)) 
    # output shape : (3,) 
    model.add(Dense(3,activation='softmax')) 
    # output shape : (3,) 
    model.compile(loss='categorical_crossentropy',optimizer='Adam',metrics=['accuracy']) 
    if summary: 
     print(model.summary()) 
    return model 
을 할 것 인 것이다