Я пытаюсь реализовать этот документ, в частности, Кодировщик с вниманием к вводу strong > раздел. По сути, это внимательное управление входной последовательностью перед ее передачей на каждый 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: []
Другие ответы на StackOverflow предполагают, что проблема может быть из-за конфликтов переменных (в этом случае возможно переназначение переменных hidden_state
и cell_state
).
Я не уверен, как решить эту проблему и что на самом деле означает ошибка.
Обновлять
Эта проблема связана с тем, что я инициализирую hidden_state
и cell_state
. Возможно, я неправильно их инициализировал. Суть в том, что мне нужно получить начальные скрытые состояния lstm
(или как-то их создать). Правильное решение этой проблемы устранит ошибку.
Это может быть проще, если keras предложит способ работать в пределах самих временных интервалов.