4.3.1. 判别器标签平滑#

标签平滑方法能够一定程度优化DCGAN的训练效果。在训练判别器时,我们鼓励判别器对输入样本的判别值接近设定的标签值,比如生成样本的判别值应接近0,真实样本的判别值应接近1。在二分类问题中,二元交叉熵损失函数的表达式为:

\[ BCELoss=-[y \log \ \hat y + (1-y) \log(1- \hat y)] \tag {4-13} \]

其中,y为真实标签,\(\hat y\)为预测值。

判别器最后一层使用的是Sigmoid激活函数,其表达式为:

\[ S(x) = \frac {1} {1+e^{-x}} \tag {4-14} \]

其中 x 为经过判别器特征提取层提取的输入到Sigmoid激活函数的特征。

在对真实样本进行判别时,随着模型的迭代,判别值和标签值的交叉熵损失逐渐趋于最小值,判别器对于真实样本的判别值越来越接近1。因为要使判别值接近1,Sigmoid激活函数的输入必须趋近于正无穷。模型逐渐向着这个使趋近于正无穷的方向学习。这时,一些判别值较小的样本便会受到影响。因为模型参数已经向趋近于正无穷的方向更新,原本判别值较小的样本在新模型参数的影响下,判别值就会变得更大并向1接近。随着参数的更新,导致判别器对于自己的预测过于“自信”,而忽略样本之间细节的差别,仅仅对样本进行简单直接的判别。所以0或1这类硬标签可能会导致模型过拟合,并削弱模型的学习能力。标签平滑后,可避免模型对硬标签的偏好,使得判别器重视一些判别值与硬标签值差距较小的样本,模型因此有更多学习的空间。同时,标签平滑可以减少标签在计算损失时的权重,起到抑制模型过拟合的作用。因此,我们尝试使用标签平滑方法改进DCGAN的训练。

标签平滑的实现较为简单,仅需将对应的0或1标签替换为设定的浮点数标签。例如训练判别器时,将真样本的标签1替换为(0.9,1)之间的值,将假样本的标签0替换为(0,0.1) 之间的值。标签平滑只对判别器使用,生成器不使用。示例代码如下所示,完整代码可扫描二维码下载。

待处理

待适配

chapter_4_3_1_01.py#
1# 判别器真标签
2D_real_label = 0.95
3# 判别器假标签
4D_fake_label = 0.05
5# 生成器真标签
6G_real_label = 1.

使用判别器标签平滑后的模型训练时间约为200分钟,训练结果为图4-9右图,图4-9左图为未使用改进方法的训练结果。可以看到经过标签平滑后,部分生成结果的真实度有所提高。

../../_images/4-9-a.png
../../_images/4-9-b.png
图4-9 改进方法前后的建筑立面效果对比