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

