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

CycleGAN训练中判别器设为不可训练的原因及相关疑问

CycleGAN人脸老化训练疑问解答

1. Discriminator设为不可训练后如何学习?

你贴的这个define_composite_model函数是CycleGAN训练流程中仅用于更新目标Generator的阶段封装,并非全程不让Discriminator训练。CycleGAN的训练是分阶段交替进行的:

  • 第一步:单独训练Discriminator,用真实图像和对应Generator生成的假图像做输入,更新Discriminator的权重,让它学会区分真假;
  • 第二步:固定Discriminator和另一个Generator的权重,只让当前目标Generator可训练,通过对抗损失、循环一致性损失、身份损失来更新Generator的权重,此时Discriminator作为"裁判"提供固定的反馈;
  • 后续会不断重复这两个阶段,交替更新Generator和Discriminator,所以Discriminator并不是一直不可训练,只是在训练Generator的阶段暂时固定权重。

附上教程中的复合模型代码:

def define_composite_model(g_model_1, d_model, g_model_2, image_shape):
    # Make the generator of interest trainable as we will be updating these weights.
    #by keeping other models constant.
    #Remember that we use this same function to train both generators,
    #one generator at a time. 
    g_model_1.trainable = True
    # mark discriminator and second generator as non-trainable
    d_model.trainable = False
    g_model_2.trainable = False
    
    # adversarial loss
    input_gen = Input(shape=image_shape)
    gen1_out = g_model_1(input_gen)
    output_d = d_model(gen1_out)
    # identity loss
    input_id = Input(shape=image_shape)
    output_id = g_model_1(input_id)
    # cycle loss - forward
    output_f = g_model_2(gen1_out)
    # cycle loss - backward
    gen2_out = g_model_2(input_id)
    output_b = g_model_1(gen2_out)
    
    # define model graph
    model = Model([input_gen, input_id], [output_d, output_id, output_f, output_b])
    
    # define the optimizer
    opt = Adam(learning_rate=0.0002, beta_1=0.5)
    # compile model with weighting of least squares loss and L1 loss
    model.compile(loss=['mse', 'mae', 'mae', 'mae'], 
                loss_weights=[1, 5, 10, 10], optimizer=opt)
    return model

2. CycleGAN与Pix2Pix的训练差异

  • Pix2Pix:属于有监督图像翻译,训练时Generator和Discriminator同步更新。因为有成对的真实图像(输入-输出一一对应)做监督,每一轮迭代中,Generator生成假图后,Discriminator立刻判断真假,两者的权重同时反向传播更新,逻辑更直接。
  • CycleGAN:属于无监督双向图像翻译,包含两个Generator(A→B、B→A)和两个Discriminator(D_A、D_B)。它采用交替训练的逻辑:先固定Discriminator和另一个Generator,训练当前目标Generator;再固定Generator,训练对应的Discriminator。这种方式是为了同时保证两个方向的翻译质量,并且通过循环一致性损失约束生成结果的合理性,和Pix2Pix的同步更新完全不同。

3. 首次迭代Loss数值是否合理?

首次迭代的Loss数值是合理的:

  • Discriminator的Loss(dA、dB)初始偏高是正常的:此时Generator还未学习到有效特征,生成的图像完全随机,Discriminator能轻松区分真假,但还没完成足够的迭代让Loss降到较低水平;
  • Generator的Loss(g)偏高是因为它需要同时满足对抗损失、循环一致性损失、身份损失三个约束,初始阶段生成效果差,多个损失叠加后数值自然较大,只要后续训练中Loss能逐步下降就没问题。

4. 单轮迭代耗时超10秒是否正常?

这取决于你的硬件配置:

  • 如果使用CPU或入门级GPU(如GTX 10系列及更早型号),这个速度是正常的;
  • 如果是中高端GPU(如RTX 30/40系列),这个速度偏慢,可能的原因包括:数据加载未优化(未开启多线程加载)、模型参数过多(CycleGAN常用ResNet结构,层数较多)、batch size设置过大。可以尝试优化数据加载逻辑或减小batch size来提速。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 07:45:18