如何在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
相关产品推荐
相关产品推荐

