Розуміння параметра input_shape в LSTM з Keras


20

Я намагаюся використовувати приклад, описаний в документації Keras під назвою "Складений LSTM для класифікації послідовностей" (див. Код нижче) і не можу визначити input_shapeпараметр у контексті моїх даних.

Я маю на увазі матрицю послідовностей з 25 можливих символів, закодованих цілими числами, до вкладеної послідовності максимальної довжини 31. В результаті мій 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 repo включає підсумкову діаграму Keras LSTM, яка показує:

  • використання таких параметрів , як return_sequences, batch_size, time_step...
  • реальна структура шарів lstm
  • концепція цих шарів у керах
  • як маніпулювати вхідними та вихідними даними, щоб відповідати вашим вимогам моделі, як складати шари LSTM

І більше


Дякую за це, @MohammadFneish. Схоже, це було б зараз корисніше. Однак не ясно, що це цілком відповідь на питання , на відміну від корисної пропозиції. Будьте в курсі, що Cross Validated - це суто питання Q&A, а не форум. Чи можете ви додати [ще більше] інформації для пояснення параметра вхідної форми?
gung - Відновіть Моніку

3
@gung Я дуже ціную те, як вам вдалося переглянути ці відповіді, щоб дотримуватися стандартів, але я думаю, що я не можу детальніше розглянути ці параметри там, де є багато технічних деталей щодо цього. Я просто думаю, що моя відповідь може бути корисною для розробників, які стикаються з подібними проблемами з введеннями керас, а не обов'язково саме з цим питанням. Спасибі
Мохаммед Фнайш

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.