Хорошо, так что ваш вопрос заставил меня задуматься, и я думаю, что я сделал это, но здесь ничего не происходит.Вот фрагмент кода, который я сделал, чтобы получить представление о реализации LSTM.
from keras.layers import LSTM
from keras.models import Sequential
model = Sequential()
model.add(LSTM(10, input_shape=(20, 30), return_sequences=True))
model.compile(loss='mse',optimizer='adam', metrics=['accuracy'])
weights = model.get_weights()
Теперь, изучая формы весов, мы можем получить представление о том, что происходит.
In [12]: weights[0].shape
Out[12]: (30, 40)
In [14]: weights[1].shape
Out[14]: (10, 40)
In [15]: weights[2].shape
Out[15]: (40,)
И вот их описание:
In [26]: model.weights
Out[26]:
[<tf.Variable 'lstm_4/kernel:0' shape=(30, 40) dtype=float32_ref>,
<tf.Variable 'lstm_4/recurrent_kernel:0' shape=(10, 40) dtype=float32_ref>,
<tf.Variable 'lstm_4/bias:0' shape=(40,) dtype=float32_ref>]
Это единственные доступные веса.Я также посмотрел реализацию Keras на https://github.com/keras-team/keras/blob/master/keras/layers/recurrent.py#L1765
Итак, вы можете видеть, что @gorjan был прав, он реализует одну ячейку, то есть 4 шлюза (для рекуррентного ввода, а также для ввода последовательности),вместе с их предвзятостью.
Мышление «слоя» здесь должно применяться к числу раз, когда LSTM будет развернут, в данном случае 30.
Надеюсь, это поможет.