在Keras中,TimeDistributed层的作用是什么?
关键词:python,machine-learning,keras,neural-network,deep-learning
今天,在做关于时间序列的数据时,遇到了一个问题。看 transformer 时,遇到源码中用到了 Keras 的 TimeDistributed wrapper,但是参数量竟然与 Keras 的 Dense 中的参数是一样的,这就奇怪了,那么就用数据来测试一下到底这两个东西有啥区别吧。
首先,列出别人也遇到的问题。
Q:
我试图了解TimeDistributed包装器在Keras中的作用。
我得到关于 TimeDistributed
的解释是: “该层应用于输入的每个时间片”。
但是我做了一些实验,却得到了我无法理解的结果。
简而言之,对于LSTM层,TimeDistributed
和仅仅用 Dense
层的结果相同。
from keras.models import Sequential
from keras.layers import Dense, Activation, LSTM, TimeDistributed
model = Sequential()
model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))
model.add(TimeDistributed(Dense(1)))
model.summary()
print(model.output_shape)
model = Sequential()
model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))
model.add((Dense(1)))
model.summary()
print(model.output_shape)
# 下面是输出预览,可见是一样的,我的 Keras 版本是:2.1.2
# 我对参数计算的理解: ((20+5)*5+5)*4 + 5*1+1 = 526
# PS: 如有不对,还请评论中提出,一起学习。参数计算就得看自己对 LSTM 和 Dense 相关知识的理解了。
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_4 (LSTM) (None, 10, 5) 520
_________________________________________________________________
time_distributed_3 (TimeDist (None, 10, 1) 6
=================================================================
Total params: 526
Trainable params: 526
Non-trainable params: 0
_________________________________________________________________
(None, 10, 1)
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm_5 (LSTM) (None, 10, 5) 520
_________________________________________________________________
dense_4 (Dense) (None, 10, 1) 6
=================================================================
Total params: 526
Trainable params: 526
Non-trainable params: 0
_________________________________________________________________
(None, 10, 1)
对于这两个模型,我得到了同样的输出 (None, 10, 1)。
在RNN层之后,谁能解释 TimeDistributed
和 Dense
层之间的区别?
目前看来没有什么不同,在这里 有一个相关的讨论。
我认为最初的意图是区分 Dense
层是将输入压平然后再进行整形,从而连接不同的时间步长并拥有更多的参数,而 TimeDistributed
将时间步长分隔开来(因此拥有更少的参数)。
在你的情况下,Dense
应该有500个参数,而 TimeDistributed
只有50。
by – gionni
不,它有相同数量的参数(都是6个)。
by – Buomsee Kim
没错,如果有差异,这些就是参数的数量。
by – gionni
Answer:
在 keras
中,当构建一个序列模型时,通常第二个维度(一个后样本维度)与时间维度相关。例如,这意味着,如果您的数据是5-dim(样本、时间、宽度、长度、信道)可以应用卷积层使用 TimeDistributed
(适用于4-dim与(样本、宽度、长度、渠道))在时间维度(应用同一层每个时间片)为了获得5-d的输出。
Dense
的情况是,在keras从2.0版默认情况下应用于最后的维度(如果你在输入形状(n, m o p)时,用 Dense(10)
你会得到输出与形状(n, m o 10))。在你的情况下 Dense
和 TimeDistributed(Dense)
是等价的。
by – Marcin Możejko
from:https://stackoverflow.com/questions/47305618/what-is-the-role-of-timedistributed-layer-in-keras