我设法创建了一个成功的 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 modelLayer (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: 455Trainable params: 455Non-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 回答
慕运维8079593
TA贡献1876条经验 获得超5个赞
在您的错误声明中,您可以看到错误是在检查目标尺寸时引起的。没有展平层的模型输出的形状(None, 7, 7)
在模型摘要中正确显示。这里的问题是您的标签的形状是(None, 7)
,因此 Keras 抛出 a ValueError
(可能在反向传播期间),因为您的标签的维度比网络的输出少一个。Keras 期望(None, 7, 7)
from 标签与您的激活层的尺寸相匹配,但收到了一个(None, 7)
。
这就是为什么model.add(Flatten())
在添加密集层之前使用可以正常工作的原因,因为目标维度和输出维度都是(None, 7)
.
添加回答
举报
0/150
提交
取消