CNN猫狗图像分类器fit函数首轮epoch后报错求助
核心问题定位与修复步骤:
修正
validation_data传参错误
你的fit函数中validation_data=(val_data_gen, classes)的写法错误。ImageDataGenerator生成的迭代器本身已包含验证数据的特征与标签,无需额外传入classes参数。修正后的代码:history = model.fit( train_data_gen, validation_data=val_data_gen, epochs=epochs, batch_size=batch_size, validation_steps=len(val_data_gen) )匹配数据生成器与损失函数的标签格式
你使用的SparseCategoricalCrossentropy(from_logits=True)要求标签为整数索引格式(如0对应cats、1对应dogs),因此在调用flow_from_directory创建训练/验证生成器时,必须将class_mode设为'sparse'(默认'categorical'会生成one-hot编码标签,与当前损失函数不兼容,直接导致图执行错误)。示例配置:val_data_gen = ImageDataGenerator(...).flow_from_directory( val_dir, target_size=(IMG_HEIGHT, IMG_WIDTH), batch_size=batch_size, class_mode='sparse', classes=["cats", "dogs"] )训练生成器需同步设置
class_mode='sparse'。确认模型结构与损失函数的兼容性
模型最后一层Dense(2)输出两个类别的logits,配合SparseCategoricalCrossentropy(from_logits=True)是完全正确的,无需修改为Dense(1)(该配置适用于BinaryCrossentropy二分类场景)。解释此前
classes=['.']的异常情况
当classes=['.']时,flow_from_directory会将整个验证文件夹视为单一类别,生成的标签全为0。此时模型仅需预测一类,因此不会报错,但实际未使用正确的猫狗分类验证数据,75%的准确率不具备参考价值。
内容的提问来源于stack exchange,提问作者Sami Haddad

