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

使用自定义图像数据集训练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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 12:07:41