为什么我的图层输出与模型摘要中显示的尺寸不同?

Why is my layer output not the same dimensions as shown in my model summary?

我成功地创建了一个可以预测字母序列中下一个字母的循环神经网络。但是,我无法弄清楚为什么我遇到的问题的解决方案有效。

我的训练数据的维度是(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输入,为什么dense layer实际上输出了一个形状为(39000,7)的tensor,如错误信息所示?我意识到 flatten() 层通过将所有内容都放在二维中来解决这个问题,但我很困惑为什么没有它就不能工作。

在您的错误陈述中,您可以看到错误是在检查 target 维度时引起的。没有展平层的模型输出的形状为 (None, 7, 7),它在模型摘要中正确显示。这里的问题是您的标签的形状为 (None, 7),因此 Keras 会抛出一个 ValueError(可能在反向传播期间),因为您的标签的维度比网络的输出少一维。 Keras 期望来自标签的 (None, 7, 7) 与激活层的尺寸相匹配,但收到的却是 (None, 7)

这就是为什么在添加密集层之前使用 model.add(Flatten()) 效果很好,因为目标维度和输出维度都是 (None, 7)