我正在尝试为序列预测实现一个简单的多对多 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'])
我通过添加和删除“tf.keras.layers.TimeDistributed”对其进行了评估。两者都达到99%的准确率!我想知道为什么会这样?那么什么时候我们需要使用“TimeDistributed”呢?那它有什么用呢?
最佳答案
对于 Dense
层,您不必使用 TimeDistributed
,因为内核获取 broadcasted .例如你有 (30, 21)
作为你的 W 和 (batch, 20, 30)
作为你的 x,所以当你乘以 kernal 得到广播乘以每个小批量输入,你最终得到 (batch, 20, 30) 次 (30, 21) 给你 (batch, 20, 21)
。这里的方程是 Wx
。
当你有更复杂的层甚至模型时,你可以使用 TimeDistributed
。想象一下您要将 CNN 模型应用于视频的每一帧。然后您可以 TimeDistributed
充分发挥它的潜力。
关于python - Keras/Tensorflow 中的时间分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52918197/