system: [SYSTEM]

user: 3. 训练框架 3.1. 生成器架构 本文采用RDB改进SRGAN的生成器架构，主要是利用DenseNet的局部密集连接，通过堆叠实现充分利用不同卷积层级之间的特征。改进的残差密集网络(RDN)生成器通过局部特征融合LFF来调整特征图数量，通过局部残差学习LRL整合上层RDB与本层RDB的信息。最后加入全局特征融合(GFF)，整合所有RDB提取的特征。 生成器网络(如图3所示)包括四个模块，1) RDB浅层特征提取的模块；2) 将RDB堆叠起来的分层特征提取模块；3) GFF全局特征整合模块；4) 亚元素卷积模块，通过图像放大得到最终重建图像。 本文将网络输入记作I LR ，输出记作I SR 。首先采用一个3 × 3卷积层完成第一次浅层特征提取，卷积核数量为64个，浅层特征提取记作： F − 1 = C o n v ( I L R ) (1) F −1 不仅会用于下一步的分层特征提取，还将用于全局残差学习。第二次的浅层特征提取与第一层相同，也是3 × 3卷积层，64个卷积核。第二层浅层特征提取的输出F 0 将作为后续一系列RDB结构的输入。 F 0 = C o n v ( I L R ) (2) 假设生成器网络一共采用K个RDB，则第d个RDB的输出F d 表示为： F d = H R D B ， d ( F d − 1 ) = H R D B ， d ( H R D B ， d − 1 ( ⋯ ( H R D B ， 1 ( F 0 ) ) ⋯ ) ) (3) 其中H RDB ，d 表示第d个RDB。 图3. 生成器模型 生成器网络一共使用了12个RDB进行堆叠。每个RDB结构如图4所示，由6个卷积层组成，每层包含64个3 × 3卷积核，采用PReLU作为激活函数。每层卷积层的输入来自于前面所有卷积层的输出堆叠形成，最后堆叠所有层的输出，并通过一个由64个大小为1 × 1的卷集核组成的卷积层调整特征图数量，并与上一个RDB的输出一起进行局部残差学习，作为这个RDB的输出。 图4. 残差密集块结构 生成器网络然后将12个RDB的输出堆叠在了一起，即将不同层的局部特征进行全局特征整合GFF。GFF由一个堆叠层和一个64个1 × 1卷积核组成的卷积层组成，紧接着采用一个3 × 3卷积层进一步提取特征，最后再与最开始产生的F −1 进行全局残差学习。 生成器网络接下来用一个卷积层将形状提升到 H ⋅ W ⋅ C ⋅ r 2 ，然后用亚元素卷积层将放大图像到 r H ⋅ r W ⋅ C ，最后采用一个3 × 3卷积层把图像压缩到RGB3通道，输出高分辨率图像。 3.2. 判别器架构 判别器用于判别图像样本的真伪，判别器模型如图5所示。 图5. 判别器模型 判别器网络首先使用一个64个3 × 3卷积核组成的卷积层提取特征，并使用Leaky ReLU作为激活函数，紧接着是一连串特征提取模块。每一个特征提取模块都由一层3 × 3卷积层，紧跟一层批规范化层(Batch-normalization， BN)层，后面接LReLU作为激活函数。第一个模块卷积层有64个卷积核，步长为2。后面两个模块卷积层的卷积核数量均为128，步长分别为1与2。再后面两个模块卷积层的卷积核数量为256，步长一样分别为1与2。最后两个模块卷积层的卷积核数量为512，步长也分别为1与2。然后通过一个1024个神经元隐层平铺特征矩阵，再通过一个隐层得到最终输出，使用sigmoid激活函数获得真实图像概率，即可给出判别结果。 3.3. 模型训练 模型训练流程如图6所示。模型训练使用ImageNet2014 [ 10 ] 数据集，随机选取5万张高清图像，通过使用bicubic插值进行缩小4倍压缩，得到对应的低分辨率图像，然后在图像中随机裁取一个32 × 32大小区域作为训练样本，固定训练样本大小的原因是因为判别器有全连接层。为了增加数据的多样性，对每张图像随机决定是否进行上下或者水平翻转，从而防止模型过拟合。 验证集则使用DIV2K高质量数据集 [ 11 ]，该数据集有800张2 K分辨率图像，也通过bicubic插值等操作得到对应的低分辨率图像。训练过程中每训练1000次就使用验证集对模型效果进行评估，并将效果最好的参数保存下来。由于GAN在刚开始训练阶段，容易因达不到纳什平衡而得到无法预料的结果，因此在训练刚开始阶段需要随时观察实际重建结果，如果不正常，需要调参重新开始训练。 训练过程中先针对生成器单独训练，然后针对生成器使用GAN，将损失函数中内容损失设置为MSE，并将对抗损失系数设置为10 −3 ，再进行训练。最后再将损失函数替换为感知损失，并将MSE损失也加入到内容损失中，再进行训练，得到最终模型。 图6. 训练流程 模型基于开源深度学习框架Keras2实现，深度学习框架采用tensorflow，python的版本为3.4，操作系统为Ubuntu16.04，显卡GTX1060 (6 G)。训练优化方法采用Adam [ 12 ]，初始学习率设置为10 −4 ，每训练1000轮将其缩减一半，训练耗时一天。 模型最终使用峰值信噪比(Peak Signal to Noise Ratio， PSNR)和结构相似性(SSIM)对重建结果进行评估，但需要先将图像从RGB空间转换到YCbCr空间中，在Y通道上计算SSIM和PSNR值。 图7. 预训练生成器 左图为loss右图为PSNR 图7左边图像是预训练生成器过程中loss的趋势图，图中可以看出预训练过程中loss震荡较严重，主要原因是GPU显存只有6G太小，每次样本数量不够多，导致loss发生比较明显的震荡，但总体仍呈下降趋势。横坐标代表训练轮数，每一轮包含1000次迭代。从图中可以看出前十几轮迭代loss下降非常明显，后面的训练，loss下降非常有限，而且产生剧烈震荡。 通过调整学习率模型可以进一步收敛，并期望最终收敛到局部最优值。为实现这一目标，我们采用Adam作为模型训练优化器，根据训练迭代数通过自适应的方式来调整学习率，其优化更新方法为： m = β 1 ⋅ m + ( 1 − β 1 ) ⋅ d x (4) m t = m ( 1 − β 1 t ) (5) v = β 2 ⋅ v + ( 1 − β 2 ) ⋅ d x 2 (6) v t = v ( 1 − β 2 t ) (7) x + = − l r ⋅ m t n p . s q r t ( v t ) + e p s (8) 其中lr为学习率，eps是一个超参数用来防止分母为0，β 1 和β 2 为优化器中的超参数，其中β 1 = 0.9，β 2 = 0.999，eps = 1e−8，t为迭代轮数。 PSNR表示信号最大可能功率和影响其表示精度的破坏性噪声功率的比值。PSNR的值越大越好，会随着训练时间越变越大。从图7右边可以看出，PSNR图像的走向趋势与MSE走向相反，在前十几轮的迭代中迅速增加，后面有震荡趋于稳定。而且，PSNR值不高，最后稳定在21.3左右，究其原因应该是ImageNet样本图像分辨率不高，压缩后高频细节丢失严重。 图8是验证集训练结果，十几轮后验证集损失降低到一个较低水平，说明模型未产生过拟合现象。验证集使用DIV2K数据集，样本图像分辨率比ImageNet高，PSNR值提升较明显，因此在训练过程中PSNR值不高与样本图像原始分辨率较低存在关联关系，很明显过于模糊的图像会导致超分辨率重建变得困难。 图8. 预训练验证器 左图为loss 右图为PSNR 图9显示的是GANs训练过程中对抗损失与内容损失走向。由于先进行了生成预训练，内容损失刚开始下降，后面一直震荡。由于判别器刚开始还未训练，依靠随机猜测输出类别，对抗损失较低。后面随着训练的进行，对抗损失越来越高，后面随着生成器生成的样本越来越接近真实样本，对抗损失再度降低，后面震荡减小，模型逐渐收敛到局部最优。 图9. 生成对抗网络训练过程，左图为对抗损失，右图为内容损失 这个阶段PSNR震荡非常明显，应该是模型生成的高频细节并不是原始图像的真实细节，比如会多出一些假的纹理和细节。从而导致重建图像与真实图像间的MSE相差较大，MSE是PSNR值计算的衡量标准，最终导致明显的震荡。