Próbuję użyć sieci neuronowej LSTM (używając Keras) do przewidywania następnego ruchu przeciwnika w grze Rock-Paper-Scissor.Keras Format danych treningu LSTM
Zakodowałem wejścia jako Rock: [1 0 0], Paper: [0 1 0], Scissor: [0 0 1]. Teraz chcę szkolić sieć neuronową, ale jestem trochę zdezorientowany strukturą danych moich danych treningowych.
Mam przechowywane historię gry przeciwnika w pliku .csv o następującej strukturze:
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
I staram się używać co 5 dane co moim etykiecie szkolenia oraz poprzednie 4 dane jako szkolenia wkład. Innymi słowy, za każdym razem wektor z wymiarem 3 jest wysyłany do sieci i mamy 4 stopnie czasowe.
Na przykład Poniżej przedstawiono dane wejściowe
1,0,0
0,1,0
0,1,0
0,0,1
a piąta to etykieta szkolenia
1,0,0
Moje pytanie brzmi, jaki typ formatu danych jest sieć LSTM Keras' zaakceptować? Jaki byłby optymalny sposób na zmianę moich danych w tym celu? Moja niekompletne kod jest załączony jako następujące czy to pomaga:
#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)