我正在尝试理解Keras中TimeDistributed包装器的作用。
我知道TimeDistributed“将一个层应用于输入的每个时间片段”。
但是我做了一些实验,得到了我无法理解的结果。
简而言之,与LSTM层连接时,TimeDistributed和普通的Dense层的结果是一样的。
model = Sequential()model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))model.add(TimeDistributed(Dense(1)))print(model.output_shape)model = Sequential()model.add(LSTM(5, input_shape = (10, 20), return_sequences = True))model.add((Dense(1)))print(model.output_shape)
对于这两个模型,我都得到了输出形状(None, 10, 1)。
谁能解释在RNN层之后,TimeDistributed和Dense层之间的区别?
回答:
在keras
中 – 构建顺序模型时 – 通常第二个维度(在样本维度之后) – 与时间
维度相关。这意味着,例如,如果你的数据是5维
,具有(样本, 时间, 宽度, 长度, 通道)
,你可以使用TimeDistributed
(适用于4维
,具有(样本, 宽度, 长度, 通道)
)沿时间维度应用卷积层(对每个时间片段应用相同的层),以获得5维
输出。
使用Dense
的情况是,在keras
从2.0版本开始,Dense
默认只应用于最后一个维度(例如,如果你对形状为(n, m, o, p)
的输入应用Dense(10)
,你将得到形状为(n, m, o, 10)
的输出),所以在你的情况下,Dense
和TimeDistributed(Dense)
是等价的。