首页 > 解决方案 > 检查目标时出错:预期 dense_10 的形状为 (2,) 但得到的数组的形状为 (1,)

问题描述

我一直在关注教程来构建我自己的图像分类器,但是当我进入这部分代码时:

model = Sequential()
model.add(InputLayer(input_shape=[64,64,1]))
model.add(Conv2D(filters=32,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))

model.add(Conv2D(filters=50,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))

model.add(Conv2D(filters=80,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))

model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512,activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(2,activation='softmax'))
optimizer = Adam(lr=1e-3)

model.compile(optimizer=optimizer,loss='categorical_crossentropy',metrics=['accuracy'])
model.fit(x=tr_img_data,y=tr_lbl_data,epochs=50,batch_size=100)
mode.summary()

我收到以下错误:

检查目标时出错:预期 dense_10 的形状为 (2,) 但得到的数组的形状为 (1,)

是我得到的错误的完整屏幕截图,但我不知道如何修复它。我对此很陌生,据我所知,它应该可以工作,因为我有 2 个课程。我正在尝试从与停车场状态相关的数据(空和满)中定义。任何帮助,将不胜感激!

是我的上下文信息代码的其余部分。

标签: pythontensorflowkerasconv-neural-network

解决方案


通过仔细查看错误,似乎one-hot encoded数组的大小有问题。我在我的笔记本电脑上尝试了您的代码,并且在对原始代码(不包含测试部分)进行了一些修改后它正在工作。请看下面修改后的代码:

import cv2
import numpy as np
from random import shuffle

from keras.models import Sequential
from keras.layers import Conv2D, InputLayer, MaxPool2D, Dense, Dropout, Flatten
from keras.optimizers import Adam

train_data = 'D:\\ML\\Tensorflow\\Datasets\\'

# Datasets folder
# - car folder - car0.jpg, car0.jpg, ..., car150.jpg
# - truck folder - truck0.jpg, truck0.jpg, ..., truck150.jpg

def one_hot_label(label):
    if label == "car":
        ohl = np.array([1, 0])
    elif label == "truck":
        ohl = np.array([0, 1])
    return ohl

def train_data_with_label():
    train_images = []

    for i in range(151):
        path = train_data+"car\\car"+str(i)+".jpg"
        img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
        img = cv2.resize(img, (64, 64))
        train_images.append([np.array(img), one_hot_label("car")])

    for j in range(151):
        path = train_data+"truck\\truck"+str(j)+".jpg"
        img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)
        img = cv2.resize(img, (64, 64))
        train_images.append([np.array(img), one_hot_label("truck")])

    shuffle(train_images)
    return train_images

training_images = train_data_with_label()
tr_img_data = np.array([i[0] for i in training_images]).reshape(-1,64,64,1)
tr_lbl_data = np.array([i[1] for i in training_images])

model = Sequential()
model.add(InputLayer(input_shape=[64,64,1]))
model.add(Conv2D(filters=32,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))

model.add(Conv2D(filters=50,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))

model.add(Conv2D(filters=80,kernel_size=5,strides=1,padding='same',activation='relu'))
model.add(MaxPool2D(pool_size=5,padding='same'))

model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512,activation='relu'))
model.add(Dropout(rate=0.5))
model.add(Dense(2,activation='softmax'))
optimizer = Adam(lr=1e-3)

model.compile(optimizer=optimizer,loss='categorical_crossentropy',metrics=['accuracy'])
model.fit(x=tr_img_data,y=tr_lbl_data,epochs=10,batch_size=100)
model.summary()

输出:

Epoch 1/10
302/302 [==============================] - 1s 3ms/step - loss: 5.4860 - acc: 0.5000
Epoch 2/10
302/302 [==============================] - 0s 264us/step - loss: 5.2789 - acc: 0.5430
Epoch 3/10
302/302 [==============================] - 0s 264us/step - loss: 4.8643 - acc: 0.5298
Epoch 4/10
302/302 [==============================] - 0s 264us/step - loss: 4.0198 - acc: 0.5232
Epoch 5/10
302/302 [==============================] - 0s 264us/step - loss: 2.5126 - acc: 0.5000
Epoch 6/10
302/302 [==============================] - 0s 264us/step - loss: 1.1055 - acc: 0.5199
Epoch 7/10
302/302 [==============================] - 0s 281us/step - loss: 0.9190 - acc: 0.5298
Epoch 8/10
302/302 [==============================] - 0s 267us/step - loss: 0.7264 - acc: 0.5563
Epoch 9/10
302/302 [==============================] - 0s 264us/step - loss: 0.7535 - acc: 0.4834
Epoch 10/10
302/302 [==============================] - 0s 264us/step - loss: 0.7393 - acc: 0.4901

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_7 (Conv2D)            (None, 64, 64, 32)        832       
_________________________________________________________________
max_pooling2d_7 (MaxPooling2 (None, 13, 13, 32)        0         
_________________________________________________________________
conv2d_8 (Conv2D)            (None, 13, 13, 50)        40050     
_________________________________________________________________
max_pooling2d_8 (MaxPooling2 (None, 3, 3, 50)          0         
_________________________________________________________________
conv2d_9 (Conv2D)            (None, 3, 3, 80)          100080    
_________________________________________________________________
max_pooling2d_9 (MaxPooling2 (None, 1, 1, 80)          0         
_________________________________________________________________
dropout_5 (Dropout)          (None, 1, 1, 80)          0         
_________________________________________________________________
flatten_3 (Flatten)          (None, 80)                0         
_________________________________________________________________
dense_5 (Dense)              (None, 512)               41472     
_________________________________________________________________
dropout_6 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_6 (Dense)              (None, 2)                 1026      
=================================================================
Total params: 183,460
Trainable params: 183,460
Non-trainable params: 0
_________________________________________________________________

推荐阅读