Простое обучение LSTM с return_sequence = True в Керасе - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь обучить простую модель RNN на основе LSTM в Керасе, используя return_sequence. Как я хочу, чтобы все выходные данные. Вот код, который я использую:

model = Sequential()
model.add(LSTM(10, return_sequences = True, input_shape = (8, 8)))
model.add(Activation('softmax'))

model.compile(loss = 'categorical_crossentropy', optimizer = adam, metrics = ['accuracy'])
model.fit(X_train, y_train, batch_size = 1, epochs = 1000, verbose = 1)

Но я получаю следующую ошибку:

model.fit(X_train, y_train, batch_size = 1, epochs = 1000, verbose = 1)
File "C:\Program Files\Anaconda3\lib\site-packages\keras\models.py", line 1002, in fit
validation_steps=validation_steps)
File "C:\Program Files\Anaconda3\lib\site-packages\keras\engine\training.py", line 1630, in fit
batch_size=batch_size)
File "C:\Program Files\Anaconda3\lib\site-packages\keras\engine\training.py", line 1480, in _standardize_user_data
exception_prefix='target')
File "C:\Program Files\Anaconda3\lib\site-packages\keras\engine\training.py", line 113, in _standardize_input_data
'with shape ' + str(data_shape))
ValueError: Error when checking target: expected activation_1 to have 3 dimensions, but got array with shape (1437, 10)

Но тот же код отлично работает, когда я меняю строку с:

model.add(LSTM(10, return_sequences = True, input_shape = (8, 8)))

до:

model.add(LSTM(10, return_sequences = False, input_shape = (8, 8)))

Я предполагаю, что мне придется изменить определение слоя активации ('softmax'), но не уверен, как. Может кто-нибудь помочь мне решить эту проблему?

ТИА

1 Ответ

0 голосов
/ 06 сентября 2018

Я вижу две основные проблемы в коде.

Во-первых, вы пытаетесь получить вывод ячейки LSTM с помощью активации softmax? При return_sequences=True выходная форма будет [batch_size, time_steps, 10]. Вам, вероятно, нужно использовать слой TimeDistributed, чтобы убедиться, что уровень активации может принимать распределенный по времени вывод как TimeDistributed(Activation('softmax')).

Затем ваш y_train имеет форму [1437,10], которая явно не распределена по времени. Чтобы использовать метки для оптимизации модели, которая выводит выходные данные формы [batch_size, time_steps, 10], ваши метки должны иметь одинаковую форму. Итак, если одна и та же метка повторяется для всех временных шагов, я бы изменил ваш код следующим образом:

# Making y_train in to time distributed format, i.e. [1437,8,10]
y_train = y_train.reshape(-1,1,10)
y_train = np.repeat(y_train,8,axis=1)

model = Sequential()
model.add(LSTM(10, return_sequences = True, input_shape = (8, 8)))

# Making sure Activation layer is TimeDistributed
model.add(TimeDistributed(Activation('softmax')))

model.compile(loss = 'categorical_crossentropy', optimizer = Adam(), metrics = ['accuracy'])
model.fit(X_train, y_train, batch_size = 1, epochs = 10, verbose = 1)
...