TensorFlow训练图像分类器报train_function空日志ValueError错误
报错根因
该报错不是Keras框架bug,由代码中三处配置问题共同导致:
- 核心配置冲突:模型输出层使用
activation='softmax',输出的是经归一化的概率值,但编译模型时给CategoricalCrossentropy传入了from_logits=True,该参数会告知框架模型输出为未经过激活的原始logits值,两者逻辑冲突会导致计算图执行异常,返回空训练日志。 - 生成器参数缺失:调用
flow_from_directory构造数据集时,未显式指定batch_size与class_mode,默认生成的数据批次大小、标签格式与后续训练逻辑不匹配,可能导致训练步骤取数为空。 - 基础参数错误:像素归一化系数写为
rescale=1./225,正确值应为除以255,该问题不会直接触发当前报错,但会严重影响模型收敛效果。
修复方案
按以下步骤修改代码即可解决问题:
- 解决损失函数与输出层的配置冲突,二选一即可:
- 保留输出层softmax激活:将损失函数修改为
tf.keras.losses.CategoricalCrossentropy(from_logits=False) - 保留
from_logits=True配置:删除最后一层Dense的softmax激活,直接输出原始logits(该方式数值稳定性更优),对应代码修改为tf.keras.layers.Dense(num_classes)
- 保留输出层softmax激活:将损失函数修改为
- 补全图像数据生成器的缺失参数,保证与训练逻辑对齐:
# 注意BATCH_SIZE=32的定义要移到生成器初始化之前 BATCH_SIZE = 32 train_generator = datagen.flow_from_directory( TRAINING_DATA, shuffle=True, target_size=IMAGE_SHAPE, batch_size=BATCH_SIZE, class_mode='categorical' ) valid_generator = datagen.flow_from_directory( VALID_DATA, shuffle=False, target_size=IMAGE_SHAPE, batch_size=BATCH_SIZE, class_mode='categorical' )
- 修正归一化参数:将
ImageDataGenerator中的rescale=1./225修改为rescale=1./255,将像素值从0-255区间正确缩放至0-1区间。 - (可选)若修改后仍需定位细粒度执行错误,可在模型编译时传入
run_eagerly=True,即可看到具体报错的代码行,而非笼统的空日志提示。
额外注意事项
- 最新版TensorFlow中
tf.keras.optimizers.Adam的学习率参数名已从lr改为learning_rate,建议同步修改为learning_rate=0.0001,避免产生废弃参数警告。 - 若数据集路径配置错误、目录下图片未被正确读取,或单类图片量过少导致
train_generator.samples // BATCH_SIZE计算出的steps_per_epoch为0,也会触发同类空日志报错,出现该情况时优先检查数据集路径有效性、调整批次大小即可。
内容的提问来源于stack exchange,提问作者user16198467
相关产品推荐
相关产品推荐

