FileNotFoundError与样本数不匹配ValueError问题求助
解决Python图像处理中的路径错误与样本数不一致问题
咱们一步步拆解你的问题,这两个报错确实是关联的,先从最开始的FileNotFoundError说起:
一、第一个问题:FileNotFoundError 根源与修复
你最初的代码里,有几个明显的问题导致了路径错误:
- 大小写敏感坑:你定义的是大写的
Path = r'D:\ncfm\train',但循环里却用了小写的path——Python对变量名大小写是严格区分的,这直接导致程序用了当前工作目录(比如你报错里的Users\\USER\\Desktop\\...),而不是你指定的D盘路径。 - 路径拼接不规范:直接用
+ '/' +拼接路径在Windows系统下很容易出问题,应该用os.path.join()来做跨系统安全拼接,它会自动处理不同系统的路径分隔符。 - 乱改原数组导致逻辑混乱:你在循环里把
folder[i+1]赋值成了图像数组,这直接覆盖了原来的文件夹名称,后续循环肯定会出错。 os.listdir用法错误:os.listdir只能接收目录路径,不能带*.jpg这种通配符,它会把整个字符串当成路径来解析,这就是你报错里出现怪异路径...*.jpg/test images的原因。
修复后的代码应该是这样的(还补了你漏导入的numpy):
import os import cv2 import numpy as np # 单独存文件夹名称,别和图像数据混在一起 folder_names = ['test images', 'ALB', 'BET', 'DOL', 'LAG', 'NoF', 'OTHER', 'SHARK', 'YFT'] base_path = r'D:\ncfm\train' # 用新数组存每个文件夹的图像数据 image_datasets = [] for folder in folder_names: # 安全拼接路径 folder_path = os.path.join(base_path, folder) # 先检查路径是否存在,避免直接报错 if not os.path.exists(folder_path): print(f"警告:路径不存在 -> {folder_path}") image_datasets.append(np.array([])) continue # 只筛选jpg文件,过滤掉非图像文件 jpg_files = [f for f in os.listdir(folder_path) if f.lower().endswith('.jpg')] # 读取并扁平化图像 folder_images = np.array([cv2.imread(os.path.join(folder_path, f)).flatten() for f in jpg_files]) image_datasets.append(folder_images)
二、第二个问题:ValueError 样本数不一致的修复
你后来改的代码里,有两个致命错误直接导致了样本数不匹配:
- 路径拼接漏逗号:
os.path.join('Users', 'USER' , 'Desktop','ncfm' 'train', fld, '*.jpg')里的'ncfm' 'train'没加逗号,Python会自动把这两个字符串拼成'ncfmtrain',这和你实际的文件夹结构完全不符。 - 错误统计样本数:你用
L.append(len(path)),这里的len(path)是路径字符串的长度,根本不是文件夹里的图像数量!这就导致你统计的“样本数”完全是错的,和实际读取的图像数量自然对不上,后续模型训练就会报样本数不一致的错误。
要正确统计每个文件夹的样本数,应该这么写:
import os folders = ['test images', 'ALB', 'BET', 'DOL', 'LAG', 'NoF', 'OTHER', 'SHARK', 'YFT'] # 修正路径拼接的逗号问题 base_path = os.path.join('Users', 'USER' , 'Desktop','ncfm', 'train') sample_counts = [] for fld in folders: folder_path = os.path.join(base_path, fld) if not os.path.exists(folder_path): print(f"警告:路径不存在 -> {folder_path}") sample_counts.append(0) continue # 统计真实的jpg文件数量 jpg_count = len([f for f in os.listdir(folder_path) if f.lower().endswith('.jpg')]) sample_counts.append(jpg_count) print(f"加载文件夹 {fld} (索引: {folders.index(fld)}),样本数: {jpg_count}") # 后续用sample_counts的时候,要和你的特征数组长度对应上
三、两个问题的关联
第一个问题的路径错误,会导致你要么读不到图像,要么只读到部分文件夹的图像;第二个问题里错误统计样本数(用路径长度凑数),会让你误以为样本数是某个数值,但实际特征数组的样本数是真实的图像数量,两者完全不匹配,就会触发Found input variables with inconsistent numbers of samples的错误。
只要按照上面的方法修复路径问题,正确统计样本数,后续的模型输入就不会出现样本数不一致的情况了。
内容的提问来源于stack exchange,提问作者SREE LAKSHMI
相关产品推荐
相关产品推荐

