You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:57:49