Построение сети LSTM с вложенным слоем в Керасе


Я хочу создать модель Keras, состоящую из слоя встраивания, за которым следуют два LSTM с dropout 0.5 и, наконец, плотный слой с активацией softmax.

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

Я попробовал следующее:

sentence_indices = Input(input_shape, dtype = 'int32')

embedding_layer = pretrained_embedding_layer(word_to_vec_map, word_to_index)

embeddings = embedding_layer(sentence_indices)
# Propagate the embeddings through an LSTM layer with 128-dimensional hidden state
X = LSTM(128, return_sequences=True, dropout = 0.5)(embeddings)

# Propagate X trough another LSTM layer with 128-dimensional hidden state
X = LSTM(128, return_sequences=False, return_state=True, dropout = 0.5)(X)

# Propagate X through a Dense layer with softmax activation to get back a batch of 5-dimensional vectors.
X = Dense(5, activation='softmax')(X)

# Create Model instance which converts sentence_indices into X.
model = Model(inputs=[sentence_indices], outputs=[X])

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

ValueError: Layer dense_5 expects 1 inputs, but it received 3 input tensors. Input received: [<tf.Tensor 'lstm_10/TensorArrayReadV3:0' shape=(?, 128) dtype=float32>, <tf.Tensor 'lstm_10/while/Exit_2:0' shape=(?, 128) dtype=float32>, <tf.Tensor 'lstm_10/while/Exit_3:0' shape=(?, 128) dtype=float32>]

Ясно, что LSTM-это не возвращая результат формы, которую я ожидаю. Как мне это исправить?

2 2

2 ответа:

Если вы задаете return_state=True, то LSTM(...)(X) возвращает три вещи: выходные данные, последнее скрытое состояние и последнее состояние ячейки.

Поэтому вместо X = LSTM(128, return_sequences=False, return_state=True, dropout = 0.5)(X) Сделайте X, h, c = LSTM(128, return_sequences=False, return_state=True, dropout = 0.5)(X)

Смотрите здесь для примера.

Если Вы читаете документацию , то при установке return_state=True выводом LSTM является список тензоров, где первый тензор является выходом, а остальные тензоры-последними состояниями.

Поэтому, я думаю, вам нужно подмножество X:

X = Dense(5, activation='softmax')(X[?])