python - 检查目标时出错:预期 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 个课程。我正在尝试从与停车场状态相关的数据(空和满)中定义。任何帮助,将不胜感激!
这是我的上下文信息代码的其余部分。
解决方案
通过仔细查看错误,似乎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
_________________________________________________________________
推荐阅读
- google-cloud-platform - Terraform 动态列表元素
- javascript - Chrome 扩展:如何将消息发送到 default_popup 页面
- javascript - 根据所选值编辑按钮“onclick”功能
- javascript - 添加 AntD 成功消息作为 firebase 身份验证过程处理程序中的一个步骤
- java - 如何在不使用 @SpringBootTest 的情况下编写使用自定义 JPA 存储库的测试
- android - 如何从 Android Emulator 访问同一网络但不同机器上的 API 端点?
- c# - IActionResult 不返回视图
- c - 我是结构的新手,我不知道是什么导致了错误:“重复标识符”
- javascript - 如何使无子节点具有一个输入框,该输入框将发布一个数字,以便它可以调用 python 函数?
- python - 转到 VS 代码中的定义不显示函数的主体