我正在尝试为序列预测实现一个简单的多对多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”?那是什么呢?
答案 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
发挥其全部潜力。