先外网下载与安装visdom,配置好visdom可视化工具,然后训练时才不报错。
(1)CycleGan网络所需数据
CycleGan例如可以把马变成斑马,把某个名星图像变成另外一个人的图像。
CycleGan只需二个数据集,不需一一对应关系,不需配对的数据集,让网络自己去学习与配对。例如一个是航拍拍出来的结果;另一个是地图数据,这时看能不能把航拍拍出来的数据集转成地图数据集。
(2)cycleGan整体网络架构
1)对抗网络如何进行学习呢?
<1>需要2对G(生成网络)和2个D(判别网络)网络
1>原始做法是:第一G是把输入图像(例如斑马)预测出一个结果(例如马),然后从这个结果放入另一个D网络中,这时也把某一类马放入到D网络中进行判别,看是否一样,这种做完根本没有与原始斑马进行比较判别,只是生成的马与放入的某类马进行比较。
cycleGan是由原来的一个G和D升级为2对G和1个D网络。这里有4个损失函数(2G加上2D各1个损失函数,还一个整体L2 Loss<输入图像与还原出来的图像间的损失>和一个Identity损失函数<原始图像输入到G网络生成新图像,那算新图像输入到G网络中后得到的图像间的损失>)。如下图:
对上面的2对G和2个D网络分解出二部分(两个数据集),例如一部分是以马为输入的(马得到斑马再还原成马),另一部分是以斑马为输入的(斑马得到马再还原成斑马),这样一共就是有四个网络,其中生长网络中有二个(例马变成斑马和斑马变成马),其中判别网络也有二个。
(3)PatchGAN判别网络原理
1)cycleGan中的PatchGAN作用
以前判别器一般是经过卷积后传入sigmoid激活函数,直接得到0----1之间的数值。但这里判别器要多做一些事情了,这里判别器一般是经过卷积后不会连sigmoid激活函数或全连接层,而是经过卷积后得到特征图(例N*N*1的矩阵),卷积后(例3*3)的感受野到原图像的某个区域(例3*3)的预测结果与标签(也是N*N)之间计算损失<即对每个Patch(即基于特征图某个点通过感受野见到原始图像中的某个区域预测结果)都要与输入进行判断(如果都是1就说明都是为真,很完美),不是整张图判别>。
(4)数据读取与预处理操作
下载pytorch-CycleGAN-and-pix2pix代码下来
1)下载数据源。打开下图中的文件,把下载的url复制到游览器中,
下载后放到这目录下:
也可以下载.pth结尾的人家训练好的模型,在测试时直接拿来用:
首先把原代码与数据集下载下来,这里要从外网下载一个visdom可视化工具并配置,若没下载就要注释掉一些代码,就不会影响训练与测试,因为visdom只是一个可视化工具来的。
现在进入代码层面的解读:
打开test.py文件配置一些环境:
打开train.py文件配置一些环境:
(5)生成网络模型构造
网络模型不算复杂,这里主要是损失函数比较复杂,只要把损失函数搞明白这个项目就明白了
下面开始构建生成器:
进入残差网络中,如下图:
上图中是画出生成网络的总体结构,纠正一下"加上反卷积"改成"加上卷积"。
反卷积后特征图个数会变少,特征图大小会变大,这与卷积是刚好相反的。
至此生成网络模型就构建好了。
(6)判别网络模块构造
下面看判别器代码:
至此判别网络也构建好了
(7)损失函数:identity loss计算方法
进入到optimize_parameters中计算损失,马上进入它的前向传播方法forward中:
这个反向传播计算的就是identity loss,它的计算思路是一个图像B经生成器生成C,然后直接拿C与B进行计算差异:
(8)生成与判别损失函数指定
1)生成器损失函数计算
MSE思想:原始图像经生成器生成A,然后A拿到判别器中去,想骗过判别器,判别器是构建出N*N的标签(target),这时特征图上对应点的预测结果与这标签进行计算得到的值就是MSE损失值。
cycle损失计算:
这六个值加起来就是生成器的损失值了。
2)判别器损失函数计算
最后反向传播更新梯度,到此生成与送别器的损失都计算。
(9)visdom可视化工具配置
略