2017-02-09 114 views
5

我正嘗試使用LSTM神經網絡(使用Keras)來預測對手在遊戲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 
0,1,0 
0,1,0 
0,0,1 

而第五個是培訓標籤

1,0,0 

我的問題是不Keras' 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

用於LSTM的輸入格式應當具有這樣的形狀(sequence_length,input_dim)。 所以在你的情況下,形狀(4,3)的numpy數組應該這樣做。

您將饋送給模型的內容將是一個形狀爲numpy的數組(number_of_train_examples,sequence_length,input_dim)。 換句話說,你將餵食形狀(4,3)的number_of_train_examples表格。 建立的名單:

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

,然後做np.array(list_of_train_example)。

但是,我不明白你爲什麼要返回第二個LSTM的整個序列?它會向你輸出形狀(4,4)的東西,密集層可能會失敗。返回序列意味着您將返回整個序列,因此每個LSTM步驟的每個隱藏輸出都會返回。我會爲第二個LSTM設置爲False,以僅得到您的Dense圖層可以讀取的形狀(4,)的「摘要」向量。 無論如何,即使對於第一個LSTM來說,它意味着在輸入形狀(4,3)的情況下,您可以輸出具有形狀(4,4)的東西,因此您將擁有比此圖層的輸入數據更多的參數。不是很好。

關於激活,我也將使用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