使用自定义图像数据集训练Keras卷积自编码器时出现无梯度提供异常的问题咨询
ValueError: No gradients provided when training custom Keras autoencoder with ImageDataGenerator
这个问题的核心原因非常直接——自编码器的训练逻辑要求输入数据同时作为模型的输入和目标输出,但你当前用flow_from_directory生成的数据集只提供了输入(x),没有对应的目标值(y)。Keras找不到计算损失的参照目标,自然无法反向传播计算梯度,就抛出了这个错误。
快速修复方案
你只需要修改生成器,让它每次返回(x, x)(即输入数据同时作为输入和待重构的目标),有两种简单的实现方式:
方式1:使用map转换生成器(TensorFlow 2.x+推荐)
直接在flow_from_directory的结果上添加map操作,把单输入转换成输入-目标对:
image_generator = ImageDataGenerator(rescale=1.0 / 255) train_gen = image_generator.flow_from_directory( os.path.join(IMAGES, "training"), class_mode=None, target_size=SHAPE, batch_size=BS, ).map(lambda x: (x, x)) # 关键修改:将输入映射为(input, target)对 val_gen = image_generator.flow_from_directory( os.path.join(IMAGES, "validation"), class_mode=None, target_size=SHAPE, batch_size=BS, ).map(lambda x: (x, x)) # 同样处理验证集生成器
方式2:自定义生成器函数(兼容旧版本Keras/TensorFlow)
如果你的环境不支持生成器的map方法,可以写一个简单的包装生成器:
def autoencoder_generator(base_generator): # 遍历基础生成器的输入,每次返回(input, input) for batch in base_generator: yield (batch, batch) image_generator = ImageDataGenerator(rescale=1.0 / 255) # 先创建基础生成器 base_train_gen = image_generator.flow_from_directory( os.path.join(IMAGES, "training"), class_mode=None, target_size=SHAPE, batch_size=BS, ) base_val_gen = image_generator.flow_from_directory( os.path.join(IMAGES, "validation"), class_mode=None, target_size=SHAPE, batch_size=BS, ) # 用自定义生成器包装 train_gen = autoencoder_generator(base_train_gen) val_gen = autoencoder_generator(base_val_gen)
额外检查点
修复生成器后,建议再确认两个细节:
- 确保你的
ConvAutoencoder.build方法返回的autoencoder模型,输入形状和输出形状完全匹配(都是(200, 200, 3)),形状不匹配也会导致损失计算失败。 - 确认你使用的损失函数(
mse)适合自编码器的重构任务,这个选择是没问题的,但如果后续还有问题,可以检查损失计算的维度是否正确。
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

