Понимание параметра 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 и различные учебные пособия, а также вопросы и ответы, мне кажется, что я упускаю что-то очевидное. Может ли кто-нибудь дать мне подсказку, что искать?

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

Ответы:


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

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методом.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.