时间分布在Keras / Tensorflow中

时间:2018-10-21 17:50:03

标签: python tensorflow keras lstm

我正在尝试为序列预测实现一个简单的多对多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%的相同精度!我想知道为什么呢?那么何时需要使用“ TimeDistributed”?那是什么呢?

1 个答案:

答案 0 :(得分:0)

对于Dense层,您不必使用TimeDistributed,因为内核可以获取broadcasted。例如,您将(30, 21)用作W,将(batch, 20, 30)用作x,因此当您乘以内核时,广播的广播数乘以每个minibatch项,最后得到(batch,20,30)次(30 ,21)给您(batch, 20, 21)。等式在Wx

当您拥有更复杂的图层甚至模型时,可以使用TimeDistributed。想象一下您要应用于视频每一帧的CNN模型。然后,您可以TimeDistributed发挥其全部潜力。