Понимание параметра input_shape в LSTM с помощью Keras

20

Я пытаюсь использовать пример, описанный в документации Keras, под названием «Stacked LSTM для классификации последовательностей» (см. Код ниже) и не могу определить input_shapeпараметр в контексте моих данных.

В качестве входных данных у меня есть матрица последовательностей из 25 возможных символов, закодированных в целых числах в дополненную последовательность максимальной длины 31. В результате my x_trainимеет (1085420, 31)значение формы (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))

В этом коде x_trainимеет форму (1000, 8, 16), как для массива из 1000 массивов из 8 массивов из 16 элементов. Там я полностью теряюсь в том, что есть что и как мои данные могут достичь этой формы.

Глядя на документацию Keras и различные учебные пособия, а также вопросы и ответы, мне кажется, что я упускаю что-то очевидное. Может ли кто-нибудь дать мне подсказку, что искать?

Спасибо за вашу помощь !

Mazieres
источник

Ответы:

23

Формы LSTM жесткие, так что не расстраивайтесь, мне пришлось потратить пару дней на борьбу с ними:

Если вы будете подавать данные по 1 символу за раз, ваша форма ввода должна быть (31,1), поскольку ваш ввод имеет 31 шаг по 1 символу каждый. Вам нужно изменить форму x_train с (1085420, 31) на (1085420, 31,1), что легко сделать с помощью этой команды:

 x_train=x_train.reshape(x_train.shape[0],x_train.shape[1],1))
tRosenflanz
источник
2

Проверьте сводную диаграмму LSTM Keras в git-репозитории, и я считаю, что вы должны получить все кристально ясно.

Это git-репо включает в себя сводную диаграмму Keras LSTM, которая показывает:

  • использование таких параметров , как return_sequences, batch_size, time_step...
  • реальная структура слоев lstm
  • понятие этих слоев в керасе
  • как манипулировать вашими входными и выходными данными в соответствии с требованиями вашей модели, как складывать слои LSTM

И более

Мохаммад Фнейш
источник
Спасибо вам за это, @MohammadFneish. Похоже, это было бы более полезно сейчас. Тем не менее, не ясно, что это вполне ответ на вопрос , в отличие от полезного предложения. Имейте в виду, что Cross Validated является строго сайтом вопросов и ответов, а не форумом. Можете ли вы добавить [еще больше] информации, чтобы объяснить входной параметр формы?
gung - Восстановить Монику
3
@ Gung Я действительно ценю то, как вам удается просматривать эти ответы, чтобы придерживаться стандартов, но я думаю, что я не могу более подробно рассказать об этих параметрах, когда есть много технических деталей, касающихся этого. Я просто думаю, что мой ответ может быть полезен для разработчиков, сталкивающихся с похожими проблемами с входными данными keras, а не обязательно с этой конкретной проблемой. Спасибо
Мохаммед Фнейш
1

Я знаю, что это не прямой ответ на ваш вопрос. Это упрощенный пример с одной ячейкой LSTM, помогающий мне понять операцию изменения формы для входных данных.

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

Это может быть примером сети LSTM только с одной ячейкой LSTM и с входными данными определенной формы.

Оказывается, мы здесь просто предсказываем, что для простоты обучения нет, но посмотрим, как нам нужно было изменить данные (чтобы добавить дополнительное измерение) перед predictметодом.

прости
источник