时间分布在 keras/Tensorflow 中



我正在尝试实现一个简单的多对多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它的全部潜力。

最新更新