Skip to main content
 首页 » 编程设计

python之Keras/Tensorflow 中的时间分布

2024年09月03日27wayfarer

我正在尝试为序列预测实现一个简单的多对多 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 充分发挥它的潜力。