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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:24:04