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

时间:2019-01-16 22:14:14

标签: python tensorflow keras recurrent-neural-network

我设法创建了一个成功的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中来解决了这个问题,但是我对为什么没有它无法工作感到困惑。

1 个答案:

答案 0 :(得分:1)

在错误声明中,您可以看到错误是由于检查 target 尺寸引起的。没有平坦层的模型输出的形状为(None, 7, 7),在模型摘要中正确显示。这里的问题是标签的形状为(None, 7),因此Keras抛出ValueError(可能是在反向传播期间),因为标签的维数比网络输出的维数小。 Keras期望标签中的(None, 7, 7)与激活层的尺寸匹配,但是却收到了(None, 7)

这就是为什么在添加密集层之前使用model.add(Flatten())可以正常工作的原因,因为目标尺寸和输出尺寸均为(None, 7)