2017-02-09 8 views
5

Я пытаюсь использовать нейронную сеть LSTM (используя Keras), чтобы предсказать следующий шаг противника в игре Rock-Paper-Scissor.Формат данных обучения Keras LSTM

Я кодировал входы как Rock: [1 0 0], Бумага: [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 

Мой вопрос, какой тип формата данных делает LSTM сеть Keras' принимает? Что было бы оптимальным способом переупорядочения моих данных для этой цели? Мой неполный код прилагается в следующем, если это поможет:

#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). Таким образом, в вашем случае необходимо сделать numpy массивы формы (4,3).

То, что вы будете кормить моделью, будет представлять собой массив с множеством цифр (number_of_train_examples, sequence_length, input_dim). Другими словами, вы будете комбинировать таблицы чисел (4,3). Составьте список:

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

, а затем сделать np.array (list_of_train_example).

Однако я не понимаю, почему вы возвращаете всю последовательность для второго LSTM? Он выдаст вам что-то с формой (4,4), плотный слой, вероятно, сработает. Последовательность возврата означает, что вы вернете всю последовательность, поэтому каждый скрытый вывод на каждом этапе LSTM. Я установил бы это для False для второго LSTM, чтобы получить только «итоговый» вектор формы (4), который может читать ваш плотный слой. В любом случае, даже для первого LSTM это означает, что с вводом формы (4,3) вы выводите то, что имеет форму (4,4), поэтому у вас будет больше параметров, чем входные данные для этого слоя ... Can «На самом деле, хорошо.

Что касается активации, я бы также использовал softmax, но только на последнем слое softmax используется для получения вероятностей в качестве вывода слоя. Не имеет смысла использовать softmax из LSTM и Dense до последнего. Пойдите для некоторой другой нелинейности, такой как «сигмоид» или «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 
Смежные вопросы