机器之心编译
参与:黄小天、曹瑞、蒋思源
edges2cats 是最近网络中火爆的开源运用,它能以你随手鼠绘的单色线图为根本自动天生一张「真实图片」。个中绘制猫的版本最受欢迎。
在 2 月 19 日推出往后,这个实现很快受到了大家的关注,乃至连 Yann LeCun 这样的重量级人物也在个中开始了自己的「创作」。
这一神奇的运用是如何实现的?让我们看看作者 Christopher Hesse 带来的教程吧。
干系链接:
Edges2cats:
http://affinelayer.com/pixsrv/index.html
Github:
https://github.com/phillipi/pix2pix
Isola 等人在 pix2pix 中得到的结果看起来很不错,它是对抗性网络的一种绝佳实现,以是我将 Torch 上的代码移植到了 Tensorflow 中。在 Github 上单文件版(single-file)的实现 pix2pix-tensorflow 已经可供下载:
https://github.com/affinelayer/pix2pix-tensorflow
下面是 pix2pix 的一些例子,我将从论文开始一步步阐明这到底是什么。
「术士的宝石,是魔力无边的宝石,它能点石成金、创造不朽、复活幽灵、杀去世巨魔,它无所不能。」——Wizard People, Dear Readers
pix2pix 大概不能复活幽灵,但是如果你给它一个包含了普通石头和其相对金子形态的数据集,那么 pix2pix 还真能点石成金。
运行代码
# make sure you have Tensorflow 0.12.1 installed firstpython -c \公众import tensorflow; print(tensorflow.__version__)\"大众# clone the repogit clone https://github.com/affinelayer/pix2pix-tensorflow.gitcd pix2pix-tensorflow# download the CMP Facades dataset http://cmp.felk.cvut.cz/~tylecr1/facade/python tools/download-dataset.py facades# train the model# this may take 1-9 hours depending on GPU, on CPU you will be waiting for a bitpython pix2pix.py \ --mode train \ --output_dir facades_train \ --max_epochs 200 \ --input_dir facades/train \ --which_direction BtoA# test the modelpython pix2pix.py \ --mode test \ --output_dir facades_test \ --input_dir facades/val \ --checkpoint facades_train
终端
在经由一段韶光的演习后,你大概会得到类似于以下的输出:
pix2pix 是若何运作的?
pix2pix 利用了一种条件天生式对抗网络(Conditional Generative Adversarial Networks)来学习从输入图像到输出图像的映射。
这个网络由两个紧张部分组成,天生器(generator)和辨别器 (discriminator)。天生器吸收了输入图像,经由转变来得到输出图像。辨别器将输入图像与未知图像(不管是数据集中的目标图像,或是辨别器产生的输出图像)进行比较,并考试测验预测该图像是否由天生器天生。
一个数据集的例子便是输入图像是黑白图片,但是目标图像是这个图像的彩色版本:
在这种情形下,天生器就会去考试测验学习如何让黑白图像变为彩色:
辨别器看到天生器彩色化的考试测验,就会去试着学习分辨天生器彩色化的图像和数据集中真正有颜色的目标图像之间的差异。
为什么要这么麻烦呢?这篇论文个中的一个重点便是辨别器为演习天生器供应了一个丢失函数,你不须要手动指定。人工设计(Hand-engineered)的转换代码已经由经由演习的神经网络所替代,所以为什么不能把手动设计的丢失函数运算也替代了呢?如果这起浸染的话,在你还在担忧打算机会取代你的事情时,它们就已经开始接管事情了。让我们来看一看对抗式网络的两个组成部分:天生器和辨别器。
天生器
天生器的事情便是对一张输入图像进行我们想要的转换,以天生目标图像。输入图像该当是黑白图像,输出图像我们想让它成为彩色版本。天生器的构造叫做「编码器—解码器」(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 数据集被测验。
终端
git clone https://github.com/affinelayer/pix2pix-tensorflow.gitcd pix2pix-tensorflowpython tools/download-dataset.py facadessudo nvidia-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 BtoAsudo nvidia-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
实现
实现是一个单一文件 pix2pix.py ,尽可能在 TensorFlow 图谱之内。移植过程多是不雅观察现有的 Torch 实现和 Torch 源代码,搞明白什么种类的层和设置被利用,以确保 TensorFlow 版本与原始版本尽可能同等。调试一个有问题的实现很耗韶光,因此我细心地考试测验这次转化以规避掉大量的调试。
pix2pix.py:
https://github.com/affinelayer/pix2pix-tensorflow/blob/master/pix2pix.py
实现开始于创建天生器图,接着是鉴别器图,末了是演习系统。在运行时利用 Torchpix2pix 代码打印天生器和鉴别器图。我在 Torch 框架源中探求不同的图层类型,并创造了当前的设置和操作,以及如何在 Tensorflow 中将实在现。
最空想的情形是能把 pix2pix 演习的网络权重导进 Tensorflow 以验证图形布局。但是这令人厌烦,而且我很不善于 Torch,以是我没有那样做。
本代码中的大多数缺点与 Tensorflow 的 build-graph-then-execute 模型干系,如果你习气于命令式代码,那么 Tensorflow 会让你感到一点惊异。
论文:Image-to-Image Translation with Conditional Adversarial Networks
择要:为实现图像到图像转化(image-to-image translation)任务,我们研究了条件对抗网络。这些网络不仅会学习从输入图像到输出图像的映射,而且还学习丢失函数来演习映射。这使得我们不必在此类任务中加入常日须要的不同的丢失公式。我们的实验证明了这种方法在从有标记的舆图中天生照片,利用单色线图天生照片,为黑白图添补色彩等任务中是有效的。我们证明了在此类模型的演习中,人类不再须要手动输入的映射函数以及丢失函数。