python - Keras/Tensorflow 中的时间分布

标签 python tensorflow keras lstm

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

关于python - Keras/Tensorflow 中的时间分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52918197/

相关文章:

python - Django 模型关系测试

Python Neupy 安装 : no lapack/blas resources found

ios - 如何在 iOS 上使用重新训练的 "tensorflow for poets"图?

python - word2vec_basic 输出 : trying to test word similarity versus human similarity scores

tensorflow - 在大量类别上训练分类器时,SVM 非常慢

python - 将base64中的字符串转换为图像并保存在文件系统中

python - 在对象中实现打包/解包

python - tensorflow 的 tables_initializer 有什么作用?

python - TensorFlow 数据不适用于多输入 keras 模型

python - 为什么调用方法在构建时在 Keras 层中被调用