Keras 如何修正期望密度_11有4维误差

Keras 如何修正期望密度_11有4维误差,keras,conv-neural-network,Keras,Conv Neural Network,当我用Keras构建卷积神经网络时,我犯了一些错误: 检查目标时出错:预期密集_11有4个维度, 但得到了形状为的数组(48986,12) 由于我缺乏知识,我不知道该解决什么问题。有人能解释原因并提出解决方案吗 input_shape=(99,81,1) nclass=12 模型=顺序() 添加(密集(32,输入形状=输入形状)) 添加(卷积2D(8,3,3,activation='relu')) add(MaxPooling2D((2,2),跨步=(2,2))) 添加(密集(128,activ

当我用Keras构建卷积神经网络时,我犯了一些错误:

检查目标时出错:预期密集_11有4个维度, 但得到了形状为的数组(48986,12)

由于我缺乏知识,我不知道该解决什么问题。有人能解释原因并提出解决方案吗

input_shape=(99,81,1)
nclass=12
模型=顺序()
添加(密集(32,输入形状=输入形状))
添加(卷积2D(8,3,3,activation='relu'))
add(MaxPooling2D((2,2),跨步=(2,2)))
添加(密集(128,activation='relu'))
添加(密集(128,activation='relu'))
添加(密集(nclass,activation='softmax'))
x_列车,x_有效,y_列车,y_有效=列车试验分割(x_列车,y_列车,试验尺寸=0.1,随机状态=2017)
#vgg
批量大小=128
nb_epoch=1
compile(优化器='adam',loss='classifical_crossentropy',metrics=['accurity'])
#模型拟合(x_序列、y_序列、nb_历元=nb_历元、批次尺寸=批次尺寸、验证_分割=0.1)
model.fit(x\u序列,y\u序列,批量大小=16,验证数据=(x\u有效,y\u有效),历代=3,无序=True,详细=2)
保存(os.path.join(model_path,'vgg16.model'))

x\u列
的形状为(99,81,1),且
nclass
输出应为
12

再次查看错误:
“检查目标时出错:预期密集_11有4个维度,但得到了形状为(48986,12)的数组”-目标=标签/输出
也就是说,输出形状存在某种问题

打印模型摘要以检查预期的输出形状:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 99, 81, 32)        64        
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 97, 79, 8)         2312      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 48, 39, 8)         0         
_________________________________________________________________
dense_2 (Dense)              (None, 48, 39, 128)       1152      
_________________________________________________________________
dense_3 (Dense)              (None, 48, 39, 128)       16512     
_________________________________________________________________
dense_4 (Dense)              (None, 48, 39, 12)        1548      
=================================================================
Total params: 21,588
Trainable params: 21,588
Non-trainable params: 0
_________________________________________________________________
最后一层输出带有形状的预测:(无,48,39,12)。
您可以看到,之所以会发生这种情况,是因为密集层使用形状(None,48,39,8)进行输入,根据Keras实现,密集层位于最后一个维度的顶部->意思是:具有128个节点的密集层使用形状(None,48,39,8)进行输入,将输出(None,48,39,128

解决方案取决于您想要做什么以及标签的形状(输出应该是什么)。
例如,如果模型的输出形状应为(nclass,1),则可以在MaxPool层之后展平数据。
如果它应该是其他东西,改变你的标签形状是(无,48,39,12)


祝你好运:)

再次查看错误:
“检查目标时出错:预期密集_11有4个维度,但得到了形状为(48986,12)的数组”-目标=标签/输出
也就是说,输出形状存在某种问题

打印模型摘要以检查预期的输出形状:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 99, 81, 32)        64        
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 97, 79, 8)         2312      
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 48, 39, 8)         0         
_________________________________________________________________
dense_2 (Dense)              (None, 48, 39, 128)       1152      
_________________________________________________________________
dense_3 (Dense)              (None, 48, 39, 128)       16512     
_________________________________________________________________
dense_4 (Dense)              (None, 48, 39, 12)        1548      
=================================================================
Total params: 21,588
Trainable params: 21,588
Non-trainable params: 0
_________________________________________________________________
最后一层输出带有形状的预测:(无,48,39,12)。
您可以看到,之所以会发生这种情况,是因为密集层使用形状(None,48,39,8)进行输入,根据Keras实现,密集层位于最后一个维度的顶部->意思是:具有128个节点的密集层使用形状(None,48,39,8)进行输入,将输出(None,48,39,128

解决方案取决于您想要做什么以及标签的形状(输出应该是什么)。
例如,如果模型的输出形状应为(nclass,1),则可以在MaxPool层之后展平数据。
如果它应该是其他东西,改变你的标签形状是(无,48,39,12)


祝您好运:)

在maxpool图层错误消失后放置展平后,谢谢您。但是我不明白flatten在CNN中做了什么,为什么它需要在maxpool之后添加,为什么它解决了我的问题根据模型摘要(您可以通过在代码中编写model.summary()来打印)maxpool层输出(无、48、39、8)。展平获取每个输入并将其重塑为1D阵列。在您的情况下,展平将输出(无,48*39*8)=(无,14976)。密度层将在每个14976节点上“工作”,因此最终输出将是您想要的(无,nclass)。如果没有展平,你的致密层将输出(无,48,39,nclass),正如你在我的答案中所看到的——这不是你想要的。希望这能帮助你理解。。请接受我的答案,如果有,请上传:)@kimsangwon因为答案解决了您的问题,请接受它(答案会占用受访者宝贵的时间)谢谢您在maxpool层错误出现后放置平坦。但是我不明白flatten在CNN中做了什么,为什么它需要在maxpool之后添加,为什么它解决了我的问题根据模型摘要(您可以通过在代码中编写model.summary()来打印)maxpool层输出(无、48、39、8)。展平获取每个输入并将其重塑为1D阵列。在您的情况下,展平将输出(无,48*39*8)=(无,14976)。密度层将在每个14976节点上“工作”,因此最终输出将是您想要的(无,nclass)。如果没有展平,你的致密层将输出(无,48,39,nclass),正如你在我的答案中所看到的——这不是你想要的。希望这能帮助你理解。。请接受我的答案,如果答案是:)@kimsangwon因为答案解决了您的问题,请接受它(答案会占用受访者宝贵的时间)