生成器的工作就是对一张输入图像进行我们想要的转换,以生成目标图像。输入图像应该是黑白图像,输出图像我们想让它成为彩色版本。生成器的结构叫做「编码器—解码器」(encoder-decoder),在 pix2pix 模型中,编码器—解码器看起来就如下图所示: 这里的容量给你一种紧挨着张量维度的形状感。样例中的输入是一个带有 3 个颜色通道(红、绿、蓝,全部等于一个黑白图像)的 256x256 图像,并且输出相同。 生成器获得一些输入,并试图用一系列的编码器(卷积+激活函数)减少它,直到成为一个较小的表征。想法是通过这种方式压缩它我们希望在最后一个编码层之后有一个更高层面的表征。解码层执行相反操作(去卷积+激活函数),并且反转编码层的行动。 为了提高论文中图到图传输的表现,作者使用 「U-Net」取代了 encoder-decoder。它们在做同样的事,不同的是有了直接连接编码层和解码层的跳跃连接。 跳跃连接给了网络一个忽略编码/解码部分的选择,如果它对其毫无用处。 这些图解略有简化。例如,网络的第一层和最后一层之间没有批标准层,中间的个别层有丢失的单元。论文中使用的着色模式对于输入和输出层有着很多不同的通道。 辨别器 辨别器(The Discriminator)的目标就是接收两张图像,一张是输入图像,另一张是未知图像(其可能是辨别的目标或者是生成器输出的图像),辨别器的工作就是识别第二张图像到底是不是从生成器(the generator)输出的。 该结构看起来就像是生成器的编码部分一样,只不过稍微复杂一点。输出是 30×30 的图像,其中每一个像素值(从 0 到 1)表示未知图像相应部分的置信度。在 pix2pix 的实现中,30×30 图像中每一个像素都对应着 70×70 块输入图像的置信度(因为输入图像是 256×256 的,所以这些图像块有很多重叠)。这种构架就称之为「区块生成对抗网络(PatchGAN)」。 训练 为了训练该网络,我们需要分两步进行:即训练辨别器(discriminator)和训练生成器(generator)。 为了训练辨别器,首先生成器需要生成一张输出图像。辨别器再根据输入/目标对(input/target pair)和输入/输出对(input/output pair)判定该图像有多大程度看起来是真实的。然后基于输入/输出对(input/output pair)和输入/目标对(input/target pair)的分类误差来调整辨别器的权重。 根据鉴别器的输出和输出与目标图像之间的差异来调节生成器的权重。 这里有一个技巧:当你在鉴别器的输出结果上训练生成器时,你实际上是在计算鉴别器的梯度,这意味着当鉴别器性能提升时,你是在训练生成器打败鉴别器。 其中的原理是这样:当鉴别器变的越来越好时,生成器也是。如果鉴别器擅长这项任务,生成器有能力通过梯度下降学习正确的映射函数,你应该得到一个逼真的生成输出。 验证 我们从一台装有 Nvidia GTX 750 Ti 显卡(~1.3 TFLOPS)的 Linux 主机上执行代码进行验证。由于计算能力的欠缺,验证并不广泛,并且只有 200 个 epoch 中的 facades 数据集被测验。 终端 gitclone https://github.com/affinelayer/pix2pix-tensorflow.gitcdpix2pix-tensorflowpython tools/download-dataset.py facadessudonvidia-docker run --volume $PWD:/prj --workdir /prj --env PYTHONUNBUFFERED=x affinelayer/pix2pix-tensorflow python pix2pix.py --mode train --output_dir facades_train --max_epochs 200 --input_dir facades/train --which_direction BtoAsudonvidia-docker run --volume $PWD:/prj --workdir /prj --env PYTHONUNBUFFERED=x affinelayer/pix2pix-tensorflow python pix2pix.py --mode test--output_dir facades_test --input_dir facades/val --checkpoint facades_train 出于对比,验证集中的第一个图像看起来像这样: 验证结果集: https://affinelayer.com/pix2pix/validation.zip 实现 (责任编辑:本港台直播) |