Математическая формулировка LSTM в Керасе? - PullRequest
2 голосов
/ 28 июня 2019

Согласно математической формулировке из wikipedia-lstm-math-уравнения , как показано ниже, LSTM Equation

должно быть только скрытое состояние h_t и состояние ячейки c_t.Однако когда я попытался написать код RNN на Keras, их было три: lstm_output, state_h и state_c.

Теперь мне интересно, какова математическая формулировка lstm_output?Вот мой код:

from keras.layers import Input, LSTM

lstm_input = Input(shape=(28, 10))

lstm_output, state_h, state_c = LSTM(units=32,
                                     return_sequences=True,
                                     return_state=True,
                                     unroll=True)(lstm_input)
print(lstm_output, state_h, state_c)

и он дает

Using TensorFlow backend.

(<tf.Tensor 'lstm_1/transpose_1:0' shape=(?, 28, 32) dtype=float32>, <tf.Tensor 'lstm_1/mul_167:0' shape=(?, 32) dtype=float32>, <tf.Tensor 'lstm_1/add_221:0' shape=(?, 32) dtype=float32>)

1 Ответ

0 голосов
/ 28 июня 2019

Давайте разберемся с этим, посмотрев на эту строку из исходного кода - return h, [h, c]:

  • lstm_output: является h изкаждый раз шаг.Таким образом, он имеет форму (batch_size, sequence_length, hidden_size), в вашем случае это (?, 28, 32).Как говорится в документации , она возвращается в виде последовательности, поскольку вы устанавливаете return_sequences=True.
  • state_h: - это последний временной шаг h и если вы можете проверить, он должен быть равен lstm_output[:,-1].Обратите внимание, почему его форма равна (?, 32), поскольку это выход последнего временного шага, а не на каждом временном шаге.
  • state_c: - это последний временной шаг c.

Уравнения часто реализуются по-разному для оптимизации определенных функций, но все они следуют оригинальной статье .Обратите внимание, что могут быть различные варианты активаций, такие как использование hard_sigmoid для повторной активации, и они должны быть четко отмечены в документации.

...