加载自定义图像数据集触发NameError:x_test未定义问题求助
问题原因
直接触发NameError的原因是:你在最后一行代码里直接使用了未定义的x_test变量——你的代码只把收集到的所有图像存入了x_train,完全没有创建x_test,自然会报错。
除此之外,你的代码还缺了两个核心环节(毕竟是要替代mnist.load_data()):
- 没有划分训练集和测试集(mnist会自动拆分好训练/测试数据)
- 没有收集图像对应的标签(
to_categorical是用来处理分类标签的,不是图像数据)
修正步骤
1. 修复数据收集逻辑,同时收集标签
假设你的数据集结构是:path1下的每个子文件夹对应一个类别(比如mnist的0-9分类文件夹),子文件夹名称对应标签。修改代码同时收集图像和标签,顺便修复原代码的缩进错误(Python靠缩进识别代码块,原代码缩进不对会直接报错):
import os import cv2 import numpy as np from tensorflow import keras path1 = 'C:\\Users\\klaud\\Desktop\\images\\' all_images = [] all_labels = [] # 用来存每个图像对应的标签 subjects = os.listdir(path1) numberOfSubject = len(subjects) print('Number of Subjects: ', numberOfSubject) # 遍历每个类别文件夹 for number1 in range(numberOfSubject): # 用os.path.join拼接路径,避免手动拼斜杠出错 path2 = os.path.join(path1, subjects[number1]) sequences = os.listdir(path2) # 从第4个文件开始读取(和原逻辑一致) for number2 in range(4, len(sequences)): path3 = os.path.join(path2, sequences[number2]) img = cv2.imread(path3, 0) # 加个判断,避免读取损坏/不存在的图像报错 if img is not None: img = img.reshape(512, 512, 1) all_images.append(img) # 用文件夹索引作为标签,也可以把subjects[number1]转成数字(如果文件夹名是数字的话) all_labels.append(number1) # 转成numpy数组 all_images = np.array(all_images) all_labels = np.array(all_labels)
2. 划分训练集和测试集
用scikit-learn的train_test_split拆分数据(没装的话先跑pip install scikit-learn):
from sklearn.model_selection import train_test_split # 按8:2拆分训练/测试集,random_state保证每次拆分结果一致 x_train, x_test, y_train, y_test = train_test_split(all_images, all_labels, test_size=0.2, random_state=42)
3. 对标签做One-Hot编码
注意:to_categorical是处理标签数据的,不是图像!原代码用错了对象,应该用在y_train和y_test上:
num_classes = numberOfSubject y_train = keras.utils.np_utils.to_categorical(y_train, num_classes) y_test = keras.utils.np_utils.to_categorical(y_test, num_classes)
最终效果
现在你得到的x_train、y_train、x_test、y_test就和mnist.load_data()返回的结构一致了(只是你的图像尺寸是512x512x1,mnist是28x28x1),可以直接用于后续模型训练。
内容的提问来源于stack exchange,提问作者clautsick
相关产品推荐
相关产品推荐

