在Keras中补充LSTM

时间:2019-02-05 21:42:06

标签: python tensorflow keras lstm

我正在使用Tensorflow后端使用Keras。

model = Sequential()
model.add(Masking(mask_value = 0., input_shape = (MAX_LENGTH, 1)))
model.add(LSTM(16, input_shape = (BATCH_SIZE, MAX_LENGTH, 1), return_sequences = False))
model.add(Dense(units = 2))
model.add(Activation("sigmoid"))
model.compile(loss = "binary_crossentropy", optimizer = "adam", metrics = ["accuracy"])

此python代码有效,但我想知道是否有16个LSTM块(每个1个单元格)或1个LSTM块(16个单元格)。

谢谢!

LSTM architecture

3 个答案:

答案 0 :(得分:2)

好,所以您的问题让我开始思考,我想我已经解决了,但是什么也没做。 这是我为获取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>]

只有这些砝码可用。我还去看了https://github.com/keras-team/keras/blob/master/keras/layers/recurrent.py#L1765

上的Keras实现

因此,您可以看到@gorjan是正确的,它实现了一个单元,即4个门(用于循环输入和序列输入)及其偏置。

此处的“层”思想应应用于展开LSTM的次数,在这种情况下为30。

希望这会有所帮助。

答案 1 :(得分:1)

这是1格16格afaik。

答案 2 :(得分:1)

使用单元格LSTM, GRU时,您本身就没有层的概念。您实际拥有的是一个只有几个门的单元。每个门构成模型在训练期间将学习的单独的权重矩阵。例如,在您的情况下,您将拥有1个单元,其中矩阵定义的每个门的尺寸为(feature_size_of_your_input, 16)。我建议您在开始实施此类内容之前,务必仔细阅读http://colah.github.io/posts/2015-08-Understanding-LSTMs/。否则,您只是将它们用作黑匣子模型,而没有了解幕后情况。