2017-02-09 33 views
5

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) 

Odpowiedz

2

format wejściowy dla LSTM powinien mieć kształt (sequence_length, input_dim). W twoim przypadku powinieneś zrobić numpy array of shape (4,3).

Tym, co zostanie podane do modelu, będzie tablica kształtu (liczba_rysów_rysów, długość_sekwencji, wielkość_danych). Innymi słowy, podasz number_of_train_examples tables of shape (4,3). Zbuduj listę:

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

a następnie zrobić np.array (list_of_train_example).

Jednak nie rozumiem, dlaczego zwracasz całą sekwencję dla drugiego LSTM? Wyśle ci coś z kształtem (4,4), warstwa Gęsta prawdopodobnie się nie powiedzie. Sekwencja powrotna oznacza, że ​​zwrócisz całą sekwencję, więc każde ukryte wyjście na każdym kroku LSTM. Ustawiłbym to na False dla drugiego LSTM, aby uzyskać jedynie "podsumowanie" wektora kształtu (4), który twoja Gęsta warstwa może odczytać. W każdym razie, nawet dla pierwszego LSTM oznacza to, że z wejściem kształtu (4,3), wypiszesz coś, co ma kształt (4,4), więc będziesz miał więcej parametrów niż dane wejściowe dla tej warstwy ... Może będzie naprawdę dobry.

Jeśli chodzi o aktywacje, używałbym softmax, ale tylko na ostatniej warstwie, softmax służy do uzyskiwania prawdopodobieństwa jako wyjścia warstwy. Nie ma sensu używać miękkiego maksimum z LSTM i Gęsty przed ostatnim. Wybierz inną nieliniowość, np. "Sigmoid" lub "tanh".

To jest to, co chciałbym robić modelu mądry

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