LSTM+Attention in Keras Ошибка при инициализации состояний нулями
Я пытаюсь реализовать этот документ конкретно, кодировщик с разделом внимания ввода. По сути, это манипулирование входной последовательностью с вниманием, прежде чем передавать ее каждому
LSTM
шаг времени. Это требует, чтобы каждый расчет временного шага lstm выполнялся вручную, чтобы вместо этого использовать предыдущее скрытое состояние и состояние ячейки.
Чтобы дать контекст, это обычный уровень кодировщика lstm:
input = layers.Input(shape=(time_window, features), dtype='float32')
lstm, state_h, state_c = layers.LSTM(units=45, activation='tanh',
return_state=True return_sequences=True)(input)
Это ручная реализация с вниманием к необработанным входным данным:
input = layers.Input(shape=(time_window, features), dtype='float32')
# Initialise the first hidden state and cell state to zeros
hidden_state = tf.zeros_like(tf.keras.backend.placeholder(shape=(None, 45)))
cell_state = tf.zeros_like(tf.keras.backend.placeholder(shape=(None, 45)))
lstm = layers.LSTM(units=45, activation='tanh', return_state=True)
# loop over the time windows
for i in range(time_window):
# get all the input features (and samples) of the current time step
input_t = input[:, i, :]
input_t = tf.expand_dims(input_t, 1)
query = tf.concat([hidden_state, cell_state], axis=-1)
# get context vector from bahdanau attention
attention_result, attention_weights = BahdanauAttention(45)([query, input_t])
attention_result = tf.expand_dims(attention_result, 1)
# pass the new inputs with attention to the encoder lstm
out, state_h, state_c = lstm(attention_result, initial_state=[hidden_state, cell_state])
# update the hidden state and cell state
hidden_state, cell_state = state_h, state_c
h.append(state_h)
c.append(state_c)
outputs.append(out)
...
# pass the above outputs to the decoder
Я получаю сообщение об ошибке, которое не знаю, как решить:
ValueError: Graph disconnected: cannot obtain value for tensor Tensor("Placeholder:0", shape=(None, 45), dtype=float32) at layer "tf_op_layer_ZerosLike". The following previous layers were accessed without issue: []
Другие ответы Stackru предполагают, что проблема может быть из-за конфликтов переменных (в этом случае, вероятно,
hidden_state
и
cell_state
переназначаемые переменные).
Я не уверен, как решить эту проблему и что на самом деле означает ошибка.
Обновить
Эта проблема связана с тем, что я инициализирую
hidden_state
и
cell_state
. Возможно, я неправильно их инициализировал. Суть в том, что мне нужно получить
lstm
исходные скрытые состояния (или как-то создать их самостоятельно). Правильное решение этой проблемы устранит ошибку.
Это может быть проще, если keras предложит способ работы в пределах самих временных интервалов.