我正在尝试实现一个简单的多对多LSTM用于序列预测。这个问题很容易。输入是 0 和 1 的序列。每个时间步长的输出是序列中直到该时间步长的 1 计数。例如,假设输入为 [0 1 0 1]。给定输入的输出将是 time0=0、time1=1、time2=1、time3=2。我应该注意,我使用一种热编码来表示输出。
假设:输入序列的长度为 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% 的相同精度!我想知道这是为什么?那么我们什么时候需要使用"时间分布"呢?那是为了什么呢?
对于Dense
层,您不必使用TimeDistributed
,因为内核是广播的。例如,你有(30, 21)
作为你的W,(batch, 20, 30)
作为你的x,所以当你乘以内核被广播乘以每个小批量条目时,你最终得到(批处理,20,30(次(30,21(给你(batch, 20, 21)
。这里Wx
方程。
当您有更复杂的层甚至模型时,您可以使用TimeDistributed
。想象一个CNN模型,你想把它应用到视频的每一帧。然后你可以TimeDistributed
它的全部潜力。