LSTM + Внимание в ошибке 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: []

Другие ответы на StackOverflow предполагают, что проблема может быть из-за конфликтов переменных (в этом случае возможно переназначение переменных hidden_state и cell_state).

Я не уверен, как решить эту проблему и что на самом деле означает ошибка.

Обновлять

Эта проблема связана с тем, что я инициализирую hidden_state и cell_state. Возможно, я неправильно их инициализировал. Суть в том, что мне нужно получить начальные скрытые состояния lstm (или как-то их создать). Правильное решение этой проблемы устранит ошибку.

Это может быть проще, если keras предложит способ работать в пределах самих временных интервалов.


person user7331538    schedule 22.09.2020    source источник