为什么我的层输出与模型摘要中显示的维度不同?

我设法创建了一个成功的 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

_________________________________________________________________

这完美地工作。我的问题是,为什么我需要展平层?当我不包括它时,我会得到这个模型摘要:


跟着这个错误


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 中解决了这个问题,但我很困惑为什么没有它它就无法工作。


尚方宝剑之说
浏览 202回答 1
1回答

慕运维8079593

在您的错误声明中,您可以看到错误是在检查目标尺寸时引起的。没有展平层的模型输出的形状(None, 7, 7)在模型摘要中正确显示。这里的问题是您的标签的形状是(None, 7),因此 Keras 抛出 a ValueError(可能在反向传播期间),因为您的标签的维度比网络的输出少一个。Keras 期望(None, 7, 7)from 标签与您的激活层的尺寸相匹配,但收到了一个(None, 7)。这就是为什么model.add(Flatten())在添加密集层之前使用可以正常工作的原因,因为目标维度和输出维度都是(None, 7).
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python