Entendendo o parâmetro input_shape no LSTM com Keras

20

Estou tentando usar o exemplo descrito na documentação do Keras chamada "LSTM empilhado para classificação de sequência" (consulte o código abaixo) e não consigo descobrir o input_shapeparâmetro no contexto dos meus dados.

Eu tenho como entrada uma matriz de sequências de 25 caracteres possíveis codificados em números inteiros para uma sequência acolchoada de comprimento máximo 31. Como resultado, my x_traintem o (1085420, 31)significado da forma (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))

Neste código x_traintem a forma (1000, 8, 16), como para uma matriz de 1000 matrizes de 8 matrizes de 16 elementos. Lá me perco completamente sobre o que é o que e como meus dados podem atingir esse formato.

Olhando para o documento de Keras e vários tutoriais e perguntas e respostas, parece que estou perdendo algo óbvio. Alguém pode me dar uma dica do que procurar?

Obrigado pela ajuda !

Mazieres
fonte

Respostas:

23

As formas LSTM são difíceis, então não me sinto mal, tive que passar alguns dias lutando com elas:

Se você estiver alimentando os dados com 1 caractere por vez, seu formato de entrada deve ser (31,1), já que sua entrada possui 31 timesteps, 1 caractere cada. Você precisará remodelar seu x_train de (1085420, 31) para (1085420, 31,1), o que é feito facilmente com este comando:

 x_train=x_train.reshape(x_train.shape[0],x_train.shape[1],1))
tRosenflanz
fonte
2

Verifique este diagrama de resumo do LSTM Keras do repositório git e acredito que você deve ter tudo claro.

Este repositório git inclui um diagrama de resumo Keras LSTM que mostra:

  • o uso de parâmetros como return_sequences, batch_size, time_step...
  • a estrutura real das camadas lstm
  • o conceito dessas camadas em keras
  • como manipular seus dados de entrada e saída para atender aos requisitos do modelo, como empilhar as camadas do LSTM

E mais

Mohammad Fneish
fonte
Obrigado por isso, @MohammadFneish. Parece que seria mais útil agora. No entanto, não está claro que essa seja uma resposta à pergunta , em oposição a uma sugestão útil. Esteja ciente de que o Validado Cruzado é estritamente um site de perguntas e respostas, não um fórum. Você pode adicionar [ainda mais] informações para explicar o parâmetro de formato de entrada?
gung - Restabelece Monica
3
@ gung Eu realmente aprecio a maneira como você está conseguindo revisar essas respostas para manter os padrões, mas acho que não posso elaborar ainda mais sobre esses parâmetros, onde há muitos detalhes técnicos a respeito. Apenas acho que minha resposta pode ser útil para desenvolvedores que enfrentam problemas semelhantes com as entradas do keras e não necessariamente esse problema em particular. Obrigado
Mohammad Fneish
1

Eu sei que não é uma resposta direta à sua pergunta. Este é um exemplo simplificado com apenas uma célula LSTM, ajudando-me a entender a operação de remodelagem dos dados de entrada.

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))

Este seria um exemplo da rede LSTM com apenas uma única célula LSTM e com os dados de entrada de formato específico.

Como se vê, estamos prevendo aqui que o treinamento não está presente por simplicidade, mas veja como precisamos remodelar os dados (para adicionar dimensão adicional) antes do predictmétodo.

prosti
fonte