“RepeatVector”和“TimeDistributed”的工作是什么?

数据挖掘 喀拉斯 lstm
2021-09-19 00:53:31

我在 Keras 文档和其他网站中读到了它们,但我无法完全理解它们究竟做了什么以及我们应该如何在设计many-to-manyencoder-decoderLSTM 网络中使用它们?

我在这里看到它们用于解决这个问题

model = Sequential()  
model.add(LSTM(input_dim=1, output_dim=hidden_neurons, return_sequences=False))  
model.add(RepeatVector(10))
model.add(LSTM(output_dim=hidden_neurons, return_sequences=True))  
model.add(TimeDistributed(Dense(1)))
model.add(Activation('linear'))   
model.compile(loss='mean_squared_error', optimizer='rmsprop', metrics=['accuracy'])
2个回答

tf.keras.layers.RepeatVector

根据文档:

重复输入 n 次。

他们还提供了一个例子:

model = Sequential()
model.add(Dense(32, input_dim=32))
# now: model.output_shape == (None, 32)
# note: `None` is the batch dimension
model.add(RepeatVector(3))
# now: model.output_shape == (None, 3, 32)

在上面的示例中,该RepeatVector层将传入的输入重复特定次数。上例中输入的形状是( 32 , ). 但是 的输出形状RepeatVector( 3 , 32 ),因为输入重复了 3 次。

tf.keras.layers.TimeDistributed()

根据文档:

该包装器允许将层应用于输入的每个时间切片。输入至少应为 3D,索引 1 的维度将被视为时间维度。

您可以参考他们网站上的示例。

TimeDistributedlayer 应用一个特定的层,例如Dense它作为输入接收的每个样本。假设输入大小是 (13 , 10 , 6 )。现在,我需要为每个形状切片( 10 、 6 )应用一个 Dense 层。然后我将Dense图层包裹在一个TimeDistributed图层中。

model.add( TimeDistributed( Dense( 12 , input_shape=( 10 , 6 ) )) )

这种层的输出形状将是 (13 , 10 , 12 )。因此,Dense如前所述,层的操作被应用于每个时间切片。

对于编码器-解码器,您的输入被压缩为单个特征向量,如果您希望输出重新生成与原始输入相同的维度,您可以“人为地”将此特征张量从 1D 转换为 2D,方法是使用RepeatVector().