Loading

【编程】生成式模型训练过程中的各种参数解析

前言

在训练cycleGAN和pix2pix进行风格迁移时,发现模型训练时的一些参数设置对训练影响很大,现在来逐个研究一下

解析

epoch

--n_epochs
类型:int
默认值:100
作用:指定使用初始学习率的 epoch 数量。默认前 100 个 epoch 中,学习率保持初始值(由 --lr 指定)不变。
--n_epochs_decay
类型:int
默认值:100
作用:指定学习率从初始值线性衰减到 0 的 epoch 数量。默认在 --n_epochs(100 个 epoch)之后,再用 100 个 epoch 让学习率逐渐降为 0,总训练 epoch 数为 200。

adam优化器

1

在深度学习中,优化器(Optimizer) 是用于调整模型参数以最小化(或最大化)损失函数的算法。其核心作用是根据模型训练时计算出的梯度(Gradient),指导参数如何更新,从而使模型的预测结果更接近真实标签。
梯度则表示损失函数随参数变化的 “变化率”(导数)。优化器的任务就是利用梯度信息,决定参数的更新方向和幅度。

2

损失函数告诉我们 “当前模型有多差”;
梯度告诉我们 “参数往哪个方向调整能让模型变好”;
优化器则告诉我们 “具体调整多少”(即更新规则)

3

早期的优化器(如随机梯度下降 SGD)原理简单,但存在收敛慢、易陷入局部最优等问题。后续优化器在 SGD 基础上改进,逐渐加入了动量(Momentum)、自适应学习率等机制

adam优化器

SGD(随机梯度下降):基础优化器,每次用单个样本的梯度更新参数;
Momentum(动量法):模拟物理中的 “惯性”,积累之前的梯度方向,加速收敛;
RMSprop:自适应调整学习率,对频繁变化的参数用小学习率,稀疏参数用大学习率;

Adam:结合了 Momentum 和 RMSprop 的优点,是目前最常用的优化器之一
核心是同时利用梯度的一阶矩(均值,类似动量)和二阶矩(方差,类似自适应学习率),实现高效稳定的参数更新

超参数:
α(学习率):控制更新幅度,默认 0.001,可根据任务调整(如调小到 0.0001);
β₁:一阶矩衰减系数,默认 0.9(常用范围 0.8~0.99);
β₂:二阶矩衰减系数,默认 0.999(常用范围 0.99~0.9999);
ε:数值稳定项,默认 1e-8(无需修改)

Adam 之所以成为深度学习中最流行的优化器,原因在于:
收敛快:结合动量机制,加速参数向最优方向移动;
自适应学习率:通过二阶矩自动调整不同参数的更新幅度(如对梯度大的参数用小学习率,避免震荡);
鲁棒性强:对学习率初始值不敏感,默认参数在大多数任务(图像、NLP 等)上表现优异;
适合大规模数据和高维参数:计算效率高,内存占用小

cycleGAN训练过程中设置的adam优化器超参数:
--beta1
类型:float
默认值:0.5
作用:指定 Adam 优化器的动量参数 β₁(Adam 优化器的两个动量参数之一),用于控制一阶矩估计的指数衰减率,默认值 0.5 是 GAN 训练中常用的设置。
--lr
类型:float
默认值:0.0002
作用:指定 Adam 优化器的初始学习率,默认 0.0002 是生成式模型(如 GAN)训练中常用的初始学习率。

GAN类型

--gan_mode
类型:str
默认值:'lsgan'
作用:指定 GAN 的目标函数类型,可选值包括:
'vanilla':原始 GAN 使用的交叉熵损失;
'lsgan':最小二乘 GAN 损失(更稳定,生成图像质量更高);
'wgangp':带梯度惩罚的 Wasserstein GAN 损失(进一步提升训练稳定性)。

--pool_size
类型:int
默认值:50
作用:指定存储 “历史生成图像” 的缓冲区大小。在 GAN 训练中,为避免判别器过度拟合当前生成的图像,会维护一个缓冲区存储过去生成的样本,每次随机从中抽取部分样本与真实样本一起训练判别器,默认缓冲区大小为 50。

  1. 为什么需要样本池(pool)?
    GAN 的训练是生成器(G)和判别器(D)的动态对抗过程:
    生成器不断更新参数,生成的样本分布会快速变化;
    判别器需要区分 “真实样本” 和 “生成样本”,若每次训练只使用生成器当前输出的最新样本,判别器可能会 “记住” 这些样本的特征(过拟合),而无法学习到更稳定的分布规律。
    例如:假设生成器在第 10 轮生成了一批偏暗的图像,第 11 轮突然生成一批偏亮的图像。若判别器只见过第 11 轮的亮图像,可能会错误地认为 “亮 = 生成样本”,而非学习真实图像的亮度分布 —— 这会导致判别器判断标准混乱,进而影响生成器的优化方向。
    样本池的引入正是为了缓解这种问题:通过缓存历史生成样本,让判别器在训练时同时接触 “新样本” 和 “旧样本”,使训练数据的分布更平滑,避免判别器被生成器的短期波动带偏。

学习率衰减策略

--lr_policy
类型:str
默认值:'linear'
作用:指定学习率衰减策略,可选值包括:
'linear':线性衰减(如 --n_epochs_decay 阶段的线性下降);
'step':阶梯式衰减(每过一定迭代次数乘以衰减系数);
'plateau':当验证指标停滞时衰减;
'cosine':余弦退火衰减(学习率按余弦曲线下降)。

示例:

这是用线性衰减时的loss曲线
linear
这是用余弦退火时的loss曲线
cosine

--lr_decay_iters(只有选择step衰减策略时才有用)
类型:int
默认值:50
作用:配合 --lr_policy='step' 使用,指定每多少迭代次数衰减一次学习率(乘以预设的 gamma 系数)。默认每 50 次迭代衰减一次学习率。

不要忘记,前面的参数里有写,学习率在前100轮是保持初始值不变的,在后100轮才开始衰减,并不是训练的全程都在衰减

关于什么是学习率衰减:
学习率衰减(Learning Rate Decay) 是一种动态调整学习率的策略:随着训练的进行(通常按训练轮次epoch或迭代步数step),逐渐减小学习率的数值。其核心目的是在训练初期用较大的学习率快速探索参数空间,后期用较小的学习率精细调整参数,从而平衡模型的训练速度和收敛精度

Plateau 衰减(ReduceLROnPlateau)
定义:一种自适应衰减策略,不依赖预设的轮次,而是根据 “验证集指标(如损失、准确率)是否停滞” 动态触发衰减 —— 当指标连续多轮未改善时,自动减小学习率。
核心逻辑
训练中持续监控指定指标(如验证集损失val_loss);
若指标在patience个 epoch 内未下降(或上升),则触发衰减(学习率乘以gamma);
可设置 “最小学习率min_lr”,避免学习率过小导致模型停止更新。

余弦退火衰减(Cosine Annealing)
定义:学习率随训练进程按余弦函数曲线衰减,模拟 “退火” 过程 —— 初期下降较快,中期加速下降,后期趋于平缓,最终接近预设最小值
优点:衰减曲线平滑,避免学习率突变导致的震荡;后期学习率下降缓慢,给模型充足的精细调整时间,适合深层模型(如 ResNet、Transformer);
缺点:需要提前确定总训练轮次T(或重启周期),对超参数较敏感。

和模型网络结构有关的参数

卷积层滤波器数量

--ngf
类型:int
默认值:64
作用:指定生成器(Generator)最后一个卷积层中的滤波器(filter)数量。滤波器数量决定了该层输出的特征图通道数,影响生成器对图像细节的表达能力。默认值 64 是生成式模型中平衡性能与计算量的常用设置。
--ndf
类型:int
默认值:64
作用:指定判别器(Discriminator)第一个卷积层中的滤波器数量。作为判别器的输入层,其滤波器数量决定了对原始图像特征的初始提取能力,默认值 64 适用于多数图像到图像转换任务。

生成器/判别器架构

--netD
类型:str
默认值:'basic'
作用:指定判别器的网络架构,可选值包括:
'basic':基础模型,即 70x70 的 PatchGAN(判别器不判断整图真假,而是判断图像中 70x70 的局部区域真假,适合捕捉局部细节);
'n_layers':可自定义层数的判别器(需配合 --n_layers_D 参数);
'pixel':像素级判别器(判断每个像素的真假,适合精细纹理生成)。

image

--netG
类型:str
默认值:'resnet_9blocks'
作用:指定生成器的网络架构,可选值包括:
'resnet_9blocks':含 9 个残差块的残差网络(适合需要保留细节的任务,如风格迁移);
'resnet_6blocks':含 6 个残差块的残差网络(轻量版,计算量更小);
'unet_256'/'unet_128':U-Net 架构,分别适用于 256x256 和 128x128 分辨率图像(擅长保留空间位置信息,适合语义分割相关生成任务)。

关于生成器/判别器结构,另外一个博客里是这样说的:
生成器G:Unet,3层上/下采样,9个残差模块
分类器D:(Conv+ InstanceNorm+ LeakyReLU)*5+全卷积分类层

和网络权重有关的参数

--norm
类型:str
默认值:'instance'
作用:指定网络中使用的归一化方式,可选值包括:
'instance':实例归一化(对单个样本的特征图归一化,适合风格迁移等任务,能保留风格一致性);
'batch':批归一化(对批次内样本的特征图归一化,适合大规模批量训练,提升稳定性);
'none':不使用归一化(可能导致训练不稳定,仅特殊场景使用)。

--init_type
类型:str
默认值:'normal'
作用:指定网络权重的初始化方式,可选值包括:
'normal':正态分布初始化(权重从均值 0、标准差由 --init_gain 指定的正态分布中采样);
'xavier':Xavier 初始化(根据输入输出维度自动调整标准差,避免梯度消失 / 爆炸);
'kaiming':Kaiming 初始化(针对 ReLU 等激活函数设计,更适合深层网络);
'orthogonal':正交初始化(权重矩阵为正交矩阵,保留梯度信息)。

--init_gain
类型:float
默认值:0.02
作用:用于 --init_type 为 'normal'、'xavier' 或 'orthogonal' 时的缩放因子,控制初始权重的幅度。默认 0.02 是生成式模型中常用的设置,避免初始权重过大影响训练稳定性。

--no_dropout
类型:开关参数(action='store_true')
作用:若启用,生成器将不使用 dropout 层。Dropout 通常用于随机失活部分神经元以防止过拟合,禁用后模型可能更易过拟合,但训练过程更稳定(尤其小数据集场景)。

--serial_batches
类型:开关参数(action='store_true')
作用:若启用,数据加载时按顺序抽取图像组成批次;否则随机抽取。顺序加载适合时序数据(如视频帧),随机加载是常规方式,可增加数据多样性。

训练过程中的参数

--num_threads
类型:int
默认值:4
作用:指定数据加载的线程数量。多线程可并行读取数据,减少训练中的 IO 阻塞,加速数据预处理流程。默认 4 线程适用于多数设备,可根据硬件性能调整。

--batch_size
类型:int
默认值:1
作用:指定每个训练批次的样本数量。批次越大,越能利用 GPU 并行计算能力,但受限于 GPU 内存;批次越小,训练波动可能越大,但内存占用更低。生成式模型常使用较小的批次(如 1 或 2)。

图像预处理参数

--load_size
类型:int
默认值:286
作用:指定图像加载时的缩放尺寸。预处理时,图像会先被缩放到该尺寸(保持长宽比),为后续裁剪(--crop_size)提供更大的区域,避免丢失关键信息。

--crop_size
类型:int
默认值:256
作用:指定图像裁剪后的最终尺寸。在缩放至 --load_size 后,会从图像中随机裁剪出该尺寸的区域作为网络输入,确保输入图像尺寸统一(如 256x256)。

--preprocess
类型:str
默认值:'resize_and_crop'
作用:指定图像加载时的预处理方式,可选值包括:

'resize_and_crop':先缩放至 --load_size,再裁剪至 --crop_size(默认方式);
'crop':直接从原图裁剪(不缩放);
'scale_width':仅按宽度缩放至目标尺寸(保持长宽比);
'scale_width_and_crop':先按宽度缩放,再裁剪;
'none':不做预处理(需确保输入图像尺寸一致)。

--no_flip
类型:开关参数(action='store_true')(这里设置为store_true代表的就是不采用数据增强)
作用:若启用,关闭图像水平翻转的数据增强。翻转是常用的增强手段(增加数据多样性),禁用后适合对方向敏感的任务(如人脸生成)。

训练时输出的各项指标

epoch: 200, iters: 485, time: 0.133, data: 0.001)
D_A: 0.271 G_A: 0.267 cycle_A: 0.151 idt_A: 0.263 D_B: 0.190 G_B: 0.440 cycle_B: 0.546 idt_B: 0.086
这里指的是各项损失函数的损失值

  • DA/GA/DB/GB指的是各个生成器/判别器的对抗损失
  • cycle_A: 0.151 A 域的循环一致性损失(A-B-A')。具体指:A 域图像x经G_A转换为 B 域图像G_A(x),再经G_B转换回 A 域图像G_B(G_A(x)),该损失是G_B(G_A(x))与原始x的差异(通常用 L1 或 L2 损失计算)。值越小说明 A 域的循环转换精度越高,转换的可逆性越好。
  • cycle_B: 0.546 B 域的循环一致性损失(B-A-B')。类似地,指 B 域图像y经G_B转换为 A 域图像G_B(y),再经G_A转换回 B 域图像G_A(G_B(y)),与原始y的差异损失。值越小说明 B 域的循环转换精度越高。
  • idt_A: 0.263 A 域的身份损失。指将 B 域图像y输入G_A(理论上G_A是 A→B 生成器,但输入 B 域图像时),生成结果G_A(y)与原始y的差异损失。
  • idt_B: 0.086 B 域的身份损失。指将 A 域图像x输入G_B(理论上G_B是 B→A 生成器,但输入 A 域图像时),生成结果G_B(x)与原始x的差异损失。
posted @ 2025-08-06 21:00  SaTsuki26681534  阅读(264)  评论(0)    收藏  举报