我设法创建了一个成功的RNN,可以预测字母序列中的下一个字母。但是,我无法弄清为什么解决我一直在解决的问题。
我的训练数据的维度为(39000,7,7)
我的模型如下:
model = Sequential()
model.add(SimpleRNN(7, input_shape = [7,7], return_sequences = True))
model.add(Flatten())
model.add(Dense(7))
model.add(Activation('softmax'))
adam = optimizers.Adam(lr = 0.001)
model.compile(loss='categorical_crossentropy',optimizer=adam, metrics=['accuracy'])
model.summary()
return model
Layer (type) Output Shape Param #
=================================================================
simple_rnn_49 (SimpleRNN) (None, 7, 7) 105
_________________________________________________________________
flatten_14 (Flatten) (None, 49) 0
_________________________________________________________________
dense_49 (Dense) (None, 7) 350
_________________________________________________________________
activation_40 (Activation) (None, 7) 0
=================================================================
Total params: 455
Trainable params: 455
Non-trainable params: 0
_________________________________________________________________
这很好用。我的问题是,为什么需要平整层?当我不包括它时,我会得到以下模型摘要:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
simple_rnn_50 (SimpleRNN) (None, 7, 7) 105
_________________________________________________________________
dense_50 (Dense) (None, 7, 7) 56
_________________________________________________________________
activation_41 (Activation) (None, 7, 7) 0
=================================================================
Total params: 161
Trainable params: 161
Non-trainable params: 0
_________________________________________________________________
此错误之后
ValueError: Error when checking target: expected activation_41 to have 3 dimensions, but got array with shape (39000, 7)
我的问题是:在第二个示例中,模型摘要说密集层的输出应为(None,7,7),并且错误消息说激活级别正好期望这样的3D输入时,为什么?密层实际上根据错误消息输出形状为(39000,7)
的张量?我意识到flatten()层通过将所有内容都置于2D中来解决了这个问题,但是我对为什么没有它无法工作感到困惑。
答案 0 :(得分:1)
在错误声明中,您可以看到错误是由于检查 target 尺寸引起的。没有平坦层的模型输出的形状为(None, 7, 7)
,在模型摘要中正确显示。这里的问题是标签的形状为(None, 7)
,因此Keras抛出ValueError
(可能是在反向传播期间),因为标签的维数比网络输出的维数小。 Keras期望标签中的(None, 7, 7)
与激活层的尺寸匹配,但是却收到了(None, 7)
。
这就是为什么在添加密集层之前使用model.add(Flatten())
可以正常工作的原因,因为目标尺寸和输出尺寸均为(None, 7)
。