检查目标时出错:预期density_2具有2维,但数组的形状为(867,44,44)

时间:2019-05-21 10:05:50

标签: python keras

我遇到了以下问题:“检查目标时出错:期望density_2具有2个维,但是数组的形状为(867,44,44)”。

我认为我需要在预处理零件期间转移尺寸或更改损失函数。

我已经搜索了关于stackoverflow的相关问题,但未能解决。有人可以帮我吗?

输入是一些彩色图片,高度为46,宽度为120,因此我将输入设置为(46,120,3)。

X_train的形状为:(1084,46,120,3) 转换为一种热编码后的Y_train(即标签)的形状为:(1084,44,44)

预处理部分和模型的详细信息如下:

model = Sequential()

X_train = X_train/255  Y_train = to_categorical(Y_train,num_classes = 44)

random_seed = 2 X_train, X_val, Y_train, Y_val = train_test_split(X_train, 
                Y_train, test_size = 0.2, random_state=random_seed)



model.add(Conv2D(filters=16,kernel_size=(5,5),padding='same',input_shape=(46,120,3),activation='relu',data_format
= 'channels_last')) 
model.add(Conv2D(filters=16,kernel_size=(5,5),padding='same',activation='relu'))

model.add(MaxPool2D(pool_size=(2,2),strides = (1,1))) 
model.add(Dropout(0.25))

model.add(Conv2D(filters=32,kernel_size=(5,5),padding='same',activation='relu')) 
model.add(Conv2D(filters=32,kernel_size=(5,5),padding='same',activation='relu'))

model.add(MaxPool2D(pool_size=(2,2),strides = (1,1))) model.add(Dropout(0.25))

model.add(Conv2D(filters=32,kernel_size=(5,5),padding='same',activation='relu')) 
model.add(Conv2D(filters=32,kernel_size=(5,5),padding='same',activation='relu'))

model.add(MaxPool2D(pool_size=(2,2),strides = (1,1))) 
model.add(Dropout(0.25))

model.add(Flatten()) 
model.add(Dense(256,activation='relu')) 
model.add(Dropout(0.3))

model.add(Dense(44,activations='softmax'))

model.compile(loss='binary_crossentropy',
               optimizer='rmsprop',metrics=['accuracy']) 
model.summary()

# Set the learning rate annealer learning_rate_reduction = 
ReduceLROnPlateau(monitor='val_acc', 
                                            patience = 3,
                                            verbose = 1, 
                                            factor = 0.5, 
                                            min_lr = 0.00001) epochs = 100 batch_size = 86

model.fit(X_train,Y_train)  

ValueError:检查目标时出错:预期density_2具有2维,但数组的形状为(867,44,44)

顺便说一句,density_2是我模型的最后一层。

2 个答案:

答案 0 :(得分:0)

将密集层作为最终输出时,不能期望以2D标注。 因此,要么需要2D标注,要么需要一个将输出2D张量的图层,或者需要将Y_train修改为Dense图层可以预测的值。

答案 1 :(得分:0)

我解决了删除to_categorical()方法的问题,并使用binary_crossentropy作为损失。因为每个Y_train是形状为(1,44)的二进制向量,并且如果添加另一个to_categorical()方法,它将使每个Y_train的形状变为(1,44,44),所以我不会知道为什么,而我仍在设法弄清楚。但这就是问题所在。谢谢大家的帮助!