Keras构建猫狗分类CNN:数组大小翻倍及Reshape报错问题
猫狗分类CNN数据处理问题修复
问题现象
训练集共约20000张图,但training_data长度达到41900,后续打包X、Y并reshape时出现嵌套序列警告,以及ValueError: cannot reshape array of size 41900 into shape (50,50,1)错误。
错误原因
- 重复遍历图片:外层循环遍历
CATEGORIES(dog和cat),每次循环都完整遍历整个文件夹的所有图片,导致每张图被处理两次,training_data长度翻倍。 - 图片未正确resize:
cv2.resize函数不会修改原数组,需要将返回结果赋值给变量,否则存储的还是原始尺寸的图片,导致X中数组形状不一致,触发ragged序列警告,后续reshape失败。 - 标签reshape错误:标签Y是单类别值,不需要reshape成
(50,50,1),这个形状是给图像特征用的,标签应该保持一维或二维(样本数×1)。
修复代码
import os import cv2 import numpy as np DATADIR = "C:/Users/me/Jupyter Codes/dogs-vs-cats/train/train" IMG_SIZE = 50 training_data = [] def create_training_data(): # 直接遍历文件夹所有图片,无需外层CATEGORIES循环 for img in os.listdir(DATADIR): animal = img.split('.')[0] # 根据文件名判断类别,0代表cat,1代表dog(可自行调整) class_num = 0 if animal == 'cat' else 1 # 读取灰度图 img_array = cv2.imread(os.path.join(DATADIR, img), cv2.IMREAD_GRAYSCALE) # 必须将resize结果赋值给变量,确保存储的是统一尺寸的图片 resized_img = cv2.resize(img_array, (IMG_SIZE, IMG_SIZE)) training_data.append([resized_img, class_num]) create_training_data() print(f"training_data长度:{len(training_data)}") # 应该接近20000 # 打包X和Y X = [] Y = [] for features, label in training_data: X.append(features) Y.append(label) # 转换为numpy数组并reshape特征X X = np.array(X).reshape(-1, IMG_SIZE, IMG_SIZE, 1) # 标签Y转换为一维numpy数组即可,无需reshape成图像形状 Y = np.array(Y)
关键修改点说明
- 移除多余循环:删掉外层遍历
CATEGORIES的循环,直接遍历文件夹图片,通过文件名判断类别,避免重复处理。 - 正确处理resize:将
cv2.resize的返回值赋值给新变量,确保存入training_data的是统一50×50尺寸的灰度图。 - 修正标签处理:Y只需要转换为一维numpy数组,符合CNN对标签的输入要求(如果用
categorical_crossentropy,后续可转成one-hot编码)。
内容的提问来源于stack exchange,提问作者I. Majid
相关产品推荐
相关产品推荐

