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

无法将大小为1的数组重塑为形状(3):图像数据集处理报错求助

问题分析与解决方案

报错原因

  1. 路径拼接错误:原代码拼接文件路径时缺少目录分隔符/,生成的路径格式为healthy_leaf文件名(而非healthy_leaf/文件名),导致cv2.imread无法找到文件,返回None。将None转为numpy数组后得到大小为1的数组,后续执行reshape(-1, 3)时触发维度不匹配的报错。
  2. 潜在读取失败风险:目录中若存在非图像文件或损坏的图像,同样会导致cv2.imread返回None,引发相同错误。

修复步骤与优化代码

1. 修复路径拼接

使用os.path.join自动处理系统路径分隔符,避免手动拼接出错。

2. 添加读取校验

跳过读取失败的文件,防止代码崩溃。

3. 适配InceptionV3预处理

InceptionV3官方推荐使用专用预处理函数,保证输入数据分布与模型训练时一致,比手动z-score更适配模型需求。同时注意cv2默认读取BGR格式,需转为RGB。

完整修正代码

import os
import cv2
import numpy as np
from tensorflow.keras.applications.inception_v3 import preprocess_input

x_dataset = []
y_dataset = []
data_dir = '/content/drive/MyDrive/Betel_leaf/dataset/training_set/healthy_leaf'
src = os.listdir(data_dir)
i = 0

for filename in src:
    full_file_name = os.path.join(data_dir, filename)
    x = cv2.imread(full_file_name)
    # 跳过无法读取的文件
    if x is None:
        print(f"跳过无效文件: {full_file_name}")
        continue
    # 转换为InceptionV3要求的RGB格式
    x = cv2.cvtColor(x, cv2.COLOR_BGR2RGB)
    # 调整图像尺寸为InceptionV3输入规格
    x = cv2.resize(x, (224, 224))
    # 使用官方预处理函数
    x = preprocess_input(x.astype('float32'))
    # 设置标签
    y = np.array(0, dtype='float32')
    
    x_dataset.append(x)
    y_dataset.append(y)
    i += 1
    print(i)

# 转换为numpy数组,适配模型输入
x_dataset = np.array(x_dataset)
y_dataset = np.array(y_dataset)

补充说明

如果坚持使用z-score预处理,需确保按通道计算(避免跨通道归一化破坏颜色信息),代码示例如下:

from scipy import stats
# 替换官方预处理部分
x = x.astype('float32')
# 对每个颜色通道单独做z-score
for channel in range(3):
    channel_data = x[:, :, channel].flatten()
    x[:, :, channel] = stats.zscore(channel_data).reshape(x[:, :, channel].shape)

内容的提问来源于stack exchange,提问作者Mozumder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 11:55:18