时间分布在 Keras/Tensorflow 中

use*_*237 4 python lstm keras tensorflow

我正在尝试为序列预测实现一个简单的多对多 LSTM。问题很简单。输入是一个由 0 和 1 组成的序列。每个时间步的输出是该时间步之前序列中 1 的计数。例如,假设输入是 [0 1 0 1]。给定输入的输出将是 time0=0、time1=1、time2=1、time3=2。我应该注意,我使用 One hot encoding 来表示输出。

假设:输入序列的长度是 20(所以我最多可以有 20 个序列)。因此,我考虑了 21 个输出类(一种热编码)。0 类表示序列中没有一个。第 21 类显示我们在序列中有 20 个。

到目前为止,我使用以下模型:

# create LSTM

model = tf.keras.models.Sequential()

model.add(tf.keras.layers.LSTM(30, input_shape=(20, 1), return_sequences=True ))
#model.add(tf.keras.layers.LSTM(30, input_shape=(20, 1)))
print (model.input_shape)
print (model.output_shape)
model.add(tf.keras.layers.Dropout(0.2))

#model.add(tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(21, activation='softmax')))
model.add(tf.keras.layers.Dense(21, activation='softmax'))


print(model.summary())


model.compile(loss='categorical_crossentropy',
             optimizer='adam',
             metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

我通过添加和删除“tf.keras.layers.TimeDistributed”来评估它。两者都达到了99%的相同准确率!我想知道为什么会这样?那么我们什么时候需要使用“TimeDistributed”呢?那是为了什么?

nur*_*ric 6

对于Dense层,您不必使用,TimeDistributed因为内核会被广播。例如,你有(30, 21)你的 W 和(batch, 20, 30)你的 x,所以当你乘以核被广播乘以每个小批量条目,你最终得到 (batch, 20, 30) 乘以 (30, 21) 给你(batch, 20, 21). 方程式在Wx这里。

您可以使用TimeDistributed,当你有更复杂的层,甚至一个模型。想象一个 CNN 模型,您希望将其应用于视频的每一帧。然后你就可以TimeDistributed发挥它的全部潜力。