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

如何在Keras中实现SimGAN依赖训练批次数据的自定义自正则化损失

实现方案

SimGAN的自正则L1损失在Keras中有两种常用的正确实现方式,都可以解决训练批次动态变化的问题:

方案1:使用add_loss方法(推荐,GAN场景更灵活)

Keras的add_loss方法可以直接将计算图中的张量加入总损失,不需要绑定损失函数的y_true和y_pred参数,天然适配动态批次的计算需求:

import keras
from keras.layers import Input
from keras.models import Model

# 前置条件:已定义好生成器generator、判别器discriminator、对抗损失local_adversarial_loss
syn_image_shape = (64,64,3) # 替换为你的实际图像尺寸
lambda_reg = 10.0 # 自正则项权重,可参考论文设置调参

# 构建联合训练计算图
syn_input = Input(shape=syn_image_shape, name="synthetic_input")
refined_output = generator(syn_input)
d_output = discriminator(refined_output)
combined_model = Model(inputs=syn_input, outputs=d_output)

# 直接添加自正则L1损失到模型
self_reg_loss = lambda_reg * keras.metrics.mean_absolute_error(syn_input, refined_output)
combined_model.add_loss(self_reg_loss)

# 编译模型,仅需配置对抗损失即可
combined_model.compile(optimizer=opt, loss=local_adversarial_loss)

训练时直接传入合成图像批次作为输入即可,框架会自动计算当前批次的自正则损失,不需要手动传入动态批次变量。

方案2:将原始合成图作为损失真值

如果不想用add_loss,也可以将生成器输出的精修图作为模型的第二个输出,把原始合成图作为该输出的真值,直接用内置的MAE损失:

# 构建联合训练计算图,输出同时包含判别器结果和精修图
combined_model = Model(inputs=syn_input, outputs=[d_output, refined_output])

# 编译时直接配置两个损失和对应权重
combined_model.compile(
    optimizer=opt,
    loss=[local_adversarial_loss, "mae"],
    loss_weights=[1.0, lambda_reg]
)

# 训练时传入的真值为[对抗标签, 原始合成图批次]
# combined_model.fit(
#     x=syn_batch,
#     y=[adversarial_gt_labels, syn_batch],
#     batch_size=32,
#     epochs=100
# )

原写法问题说明

之前的写法错误原因是:模型编译是静态构建计算图的步骤,在编译阶段就传入运行期才会生成的current_batch_of_refined、current_batch_of_synthetic动态批次变量,计算图无法正确绑定动态值,因此无法正常运行。

内容的提问来源于stack exchange,提问作者Jonas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:09:01