Python训练CNN模型如何正确拟合图像数据及输入形状报错求解
错误根因
- 数据加载逻辑顺序颠倒:
load_data()返回顺序是(标签, 图像数据),但split_data()里用x, y = self.load_data()接收,导致x实际存储一维标签数据,y存储图像数据。后续调用model.fit(self.x_train, self.y_train)相当于把一维标签传给要求4维输入的CNN模型,直接触发shape不匹配错误。 - 变量名拼写错误:
load_data()中从未定义train_labels_decode变量,直接调用会触发变量未定义报错,实际要使用的是存储标签的train_labels_encode或train_labels变量。 - 损失函数与输出层不匹配:2分类任务下输出层用了2个神经元+softmax激活,如果标签是整数编码(0/1),损失函数应该用
sparse_categorical_crossentropy;如果要使用binary_crossentropy,输出层应改为1个神经元+sigmoid激活,同时标签要做独热编码。 - 网络结构代码缩进错误:
DenseNet201类中的transition_layer函数、densenet方法的核心逻辑缩进层级错误,同时densenet方法没有加静态方法装饰器,调用时会报错。
修复步骤
1 修正数据加载逻辑
修改load_data()函数如下:
@staticmethod def load_data(): """Loads and Preprocess dataset""" train_labels = [] train_data = [] # 替换为你实际的类别文件夹名称与对应编码 label_map = {'类别A':0, '类别B':1} file_list = os.listdir(dataset_folder) for folder in file_list: img_dir = os.path.join(dataset_folder, folder) for img_name in os.listdir(img_dir): full_path = os.path.join(img_dir, img_name) train_data.append(TrainingPreprocessing.preprocessing_train(full_path)) train_labels.append(label_map[folder]) # 调整返回顺序为(图像数据, 标签),和接收变量对应 return np.array(train_data), np.array(train_labels)
2 修正损失函数配置
将train()方法中模型编译代码修改为:
# 对应整数标签+2类softmax输出的配置 model.compile(loss='sparse_categorical_crossentropy', optimizer='Adam', metrics=["accuracy"])
3 修正DenseNet结构代码
给densenet方法加@staticmethod装饰器,调整transition_layer函数的缩进层级,使其和dense_block函数同级,都定义在densenet方法内部。
验证修复效果
修改完成后运行代码,首先确认split_data()打印的训练数据shape为(样本数, 224, 224, 3) (样本数,),符合预期后再执行训练即可解决输入shape不匹配问题。
内容的提问来源于stack exchange,提问作者stilllearn
相关产品推荐
相关产品推荐

