我目前正在尝试使用基于 Tensorflow 的 Keras 对时间序列数据进行分类,从而迈出第一步。我能够运行一个非常简单的模型,但是在一些反馈之后,建议我连续使用多个 GRU 层并在我的密集层周围添加TimeDistributed 包装器。这是我正在尝试的模型:
model = Sequential()
model.add(GRU(100, input_shape=(n_timesteps, n_features), return_sequences=True, dropout=0.5))
model.add(GRU(100, return_sequences=True, go_backwards=True, dropout=0.5))
model.add(GRU(100, return_sequences=True, go_backwards=True, dropout=0.5))
model.add(GRU(100, return_sequences=True, go_backwards=True, dropout=0.5))
model.add(GRU(100, return_sequences=True, go_backwards=True, dropout=0.5))
model.add(GRU(100, return_sequences=True, go_backwards=True, dropout=0.5))
model.add(TimeDistributed(Dense(units=100, activation='relu')))
model.add(TimeDistributed(Dense(n_outputs, activation='softmax')))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
尝试使用形状为 (2357, 128, 11) (2357 个样本,128 个时间步长,11 个特征)的输入拟合模型时,我收到以下错误消息:
ValueError: Error when checking target: expected time_distributed_2 to have 3 dimensions, but got array with shape (2357, 5)
这是输出model.summary()
:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
gru_1 (GRU) (None, 128, 100) 33600
_________________________________________________________________
gru_2 (GRU) (None, 128, 100) 60300
_________________________________________________________________
gru_3 (GRU) (None, 128, 100) 60300
_________________________________________________________________
gru_4 (GRU) (None, 128, 100) 60300
_________________________________________________________________
gru_5 (GRU) (None, 128, 100) 60300
_________________________________________________________________
gru_6 (GRU) (None, 128, 100) 60300
_________________________________________________________________
time_distributed_1 (TimeDist (None, 128, 100) 10100
_________________________________________________________________
time_distributed_2 (TimeDist (None, 128, 5) 505
=================================================================
Total params: 345,705
Trainable params: 345,705
Non-trainable params: 0
那么将多个 GRU 层连续放置并将 TimeDistributed Wrapper 添加到以下 Dense 层的正确方法是什么。我将非常感谢任何有用的输入
如果您return_sequences = False
在 GRU 的最后一层设置,代码将起作用。
您只需要将return_sequences = True
RNN 的输出再次馈送到 RNN 的输入,从而保留时间维度空间。当您设置 时return_sequences = False
,这意味着输出将仅是最后一个隐藏状态(而不是每个时间步的隐藏状态),并且时间维度将消失。
这就是为什么当您设置 时return_sequnces = False
,输出维数从 N 减少到 N-1。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句