DCGAN训练人脸照片,pytorch

4、模型设计

1、生成器

论文中生成器的结构如图:

生成器将潜在向量z(白噪声)转换为特定大小的图片数据,转换由一系列逆卷积操作完成,最后通过tanh函数转换成模型需要的[-1, 1]数值范围的张量。超参数的选择严格按照论文给出,值得注意的是,每一个逆卷积层后都有一个批量标准化层BN,这是DCGAN论文的关键贡献,BN层有助于解决反向转播时梯度消失或爆炸的问题

对应于DCGAN,我们的设置如下:
除了从噪声z到第一个特征图(1024)的kernel设置不一样,为(4, 1, 0),其他都一样(4,2, 1),括号中依次表示:核kernel大小,步长stride,padding大小

2、判别器

判别器是正常的二元分类网络,输入图像数据,输出为真实样本的概率。不同的是,卷积层后没有添加池化层,而是采用跨步卷积的方式。DCGAN论文提到使用跨步卷积而不是池化来降低采样是一种很好的做法,因为它可以让网络学习自己的池化方法。最后Sigmoid激活函数输出真实样本的概率。

3、模型参数初始化

DCGAN论文指出,模型的权重参数应按照正态分布初始化,满足均值为0,标准差为0.02。所以应在模型实例化后按照这个原则初始化权重参数。

5、模型训练

训练部分,官网教程按照的ganhacks最佳实践来实现论文算法。我这里做了一些修改,在训练判别器时ganhacks将真实样本和生成器样本分为不同的批次训练,分别计算损失值并各自传播梯度,然后累积梯度,再执行优化;我将两步的损失函数重新构造一个损失函数,从最终损失函数只传播一次梯度,更符合论文的算法逻辑。

1、判别器训练

损失函数目标:令- [logD(x) + log(1 - D(G(z)))]接近0,或者说最大化logD(x) + log(1 - D(G(z)))。

  • 第一步,取一批次的真实样本,通过判别器,将目标标签设为1,通过BCEloss计算-logD(x);
  • 第二步,生成器产生相同批次大小的假样本,通过判别器,设置目标标签为0,通过BCEloss计算-log(1 - D(G(z)));
  • 第三步,两者相加为最终损失值,再反向传播梯度,执行优化。

注意,这里通过detach()切断向生成器网络传播的梯度。

2、生成器训练

损失函数目标:令 - [logD(G(z))]接近0,或者说最大化 logD(G(z))。

  1. 生成器产生的假样本,通过刚刚执行过优化的判别器,这次将目标标签设置为1,
  2. 损失函数计算 - [logD(G(z))],
  3. 反向传播梯度,执行优化。


 


 

猜你喜欢

转载自blog.csdn.net/weixin_43135178/article/details/115140960