Zrozumienie parametru input_shape w LSTM za pomocą Keras

20

Próbuję użyć przykładu opisanego w dokumentacji Keras o nazwie „Stacked LSTM do klasyfikacji sekwencji” (patrz kod poniżej) i nie mogę znaleźć input_shapeparametru w kontekście moich danych.

Mam jako dane wejściowe macierz sekwencji 25 możliwych znaków zakodowanych w liczbach całkowitych do sekwencji wypełnionej o maksymalnej długości 31. W rezultacie moje x_trainma (1085420, 31)znaczenie kształtu (n_observations, sequence_length).

from keras.models import Sequential
from keras.layers import LSTM, Dense
import numpy as np

data_dim = 16
timesteps = 8
num_classes = 10

# expected input data shape: (batch_size, timesteps, data_dim)
model = Sequential()
model.add(LSTM(32, return_sequences=True,
               input_shape=(timesteps, data_dim)))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32, return_sequences=True))  # returns a sequence of vectors of dimension 32
model.add(LSTM(32))  # return a single vector of dimension 32
model.add(Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# Generate dummy training data
x_train = np.random.random((1000, timesteps, data_dim))
y_train = np.random.random((1000, num_classes))

# Generate dummy validation data
x_val = np.random.random((100, timesteps, data_dim))
y_val = np.random.random((100, num_classes))

model.fit(x_train, y_train,
          batch_size=64, epochs=5,
          validation_data=(x_val, y_val))

W tym kodzie x_trainma kształt (1000, 8, 16), jak dla tablicy 1000 tablic z 8 tablicami 16 elementów. Tam całkowicie się zagubiłem na temat tego, co i jak moje dane mogą osiągnąć ten kształt.

Patrząc na dokument Keras i różne samouczki oraz pytania i odpowiedzi, wydaje mi się, że brakuje mi czegoś oczywistego. Czy ktoś może mi podpowiedzieć, czego szukać?

Dzięki za pomoc !

labirynty
źródło

Odpowiedzi:

23

Kształty LSTM są trudne, więc nie czuj się źle, musiałem spędzić kilka dni walcząc z nimi sam:

Jeśli będziesz podawać dane 1 znak naraz, twój kształt wejściowy powinien wynosić (31,1), ponieważ twoje wejście ma 31 kroków czasowych, po 1 znaku każdy. Konieczne będzie przekształcenie x_train z (1085420, 31) na (1085420, 31,1), co można łatwo zrobić za pomocą tego polecenia:

 x_train=x_train.reshape(x_train.shape[0],x_train.shape[1],1))
tRosenflanz
źródło
2

Sprawdź ten schemat podsumowania repozytorium git LSTM Keras i uważam, że wszystko powinno być kryształowo czyste.

To repozytorium git zawiera diagram podsumowania Keras LSTM, który pokazuje:

  • wykorzystanie parametrów podoba return_sequences, batch_size, time_step...
  • prawdziwa struktura warstw LSTM
  • koncepcja tych warstw w keras
  • jak manipulować danymi wejściowymi i wyjściowymi w celu dopasowania do wymagań modelu, jak układać warstwy LSTM

I więcej

Mohammad Fneish
źródło
Dziękuję za to, @MohammadFneish. Wygląda na to, że byłoby to teraz bardziej pomocne. Nie jest jednak jasne, czy jest to dość odpowiedź na pytanie , a nie pomocna sugestia. Należy pamiętać, że Cross Validated jest ściśle witryną pytań i odpowiedzi, a nie forum. Czy możesz dodać [jeszcze więcej] informacji, aby wyjaśnić parametr kształtu wejściowego?
Gung - Przywróć Monikę
3
@ Gung Naprawdę doceniam sposób, w jaki udaje ci się przejrzeć te odpowiedzi, aby zachować standardy, ale myślę, że nie mogę opracować jeszcze więcej na temat tych parametrów, jeśli istnieje wiele szczegółów technicznych na ich temat. Po prostu myślę, że moja odpowiedź może być pomocna dla programistów mających podobne problemy z wejściami do kamer, a niekoniecznie ten konkretny problem. Dzięki
Mohammad Fneish
1

Wiem, że nie jest to bezpośrednia odpowiedź na twoje pytanie. Jest to uproszczony przykład z tylko jedną komórką LSTM, która pomaga mi zrozumieć operację przekształcania danych wejściowych.

from keras.models import Model
from keras.layers import Input
from keras.layers import LSTM
import numpy as np

# define model
inputs1 = Input(shape=(2, 3))
lstm1, state_h, state_c = LSTM(1, return_sequences=True, return_state=True)(inputs1)
model = Model(inputs=inputs1, outputs=[lstm1, state_h, state_c])

# define input data
data = np.random.rand(2, 3)
data = data.reshape((1,2,3))

# make and show prediction
print(model.predict(data))

Byłby to przykład sieci LSTM z pojedynczą komórką LSTM i danymi wejściowymi o określonym kształcie.

Jak się okazuje, po prostu przewidujemy, że szkolenie nie jest przedstawione dla uproszczenia, ale spójrz, jak potrzebowaliśmy zmienić dane (aby dodać dodatkowy wymiar) przed predictmetodą.

prosti
źródło