国外有个男孩子,为了哄女孩子开心,训练了一个 BEGAN 的神经网络模型来画小猫猫!真的很热爱代码了
Zack Nado 是 Google Brain 的一名工程师,他和他的女朋友都是 Pusheen(胖吉猫)的超级粉丝。国内可能对 Pusheen 不太熟悉,它是由 Claire Belton 和 Andrew Duff 两位艺术家创作的一只丰满的灰色虎斑短毛猫,Facebook 设定页面的插图几乎都是 Pusheen。
所以呢,为了给女朋友过生日,Zack 就开始尝试创建一个机器学习程序来画 Pusheen!
Zack 创建的是 「Generative Adversarial Network」 ,简称 「GAN」 ,即生成式对抗网络,是目前很流行的机器学习程序类型。
▎ 制作猫猫数据集
为了让神经网络对画猫猫这件事有所了解,就需要给它们足够多的目标图像,多多益善。但这对于 Pusheen 来说是个小问题,因为并没有这么多 Pusheen 图像。和那些动辄 50,000-1,200,000 个图像的标准机器学习数据集相比,Pusheen 的图像实在太少了。
所以 Zack 就用了些小技巧来制作新图像 —— 将原图旋转、缩放、翻转!
有了足够多的猫猫图片,就可以将其使用在神经网络中了!
▎ 训练神经网络
之所以称之为「生成式对抗网络」,是因为这个模型中包含两个模块 —— 生成模型(Generative Model)和判别模型(Discriminative Model),我们可以这样简单理解:
- 判别器学习生成器产生的图像中的缺陷,以便它能从假图像中挑选出真实的图像
- 生成器学习如何生成与真实图像类似的图像,以使判别器无法区分
于是这个模型中的两个模块都有自己的目标,我们就可以开始训练神经网络了。典型的设置是这样的:
- 给判别器一些真实的图像,让它知道 Pusheen 猫长什么样子
- 给生成器一些随机数,让它开始生成一些图像
- 将生成的图像传给判别器,让判别器知道生成器生成了什么图像
- 重复 Step 1
在几十万次重复后,我们就拥有了一个擅长制作 Pusheen 的发生器,以及一个在真伪图像中徘徊的鉴别器了。下面这个视频能让我们直观地看到神经网络的工作进度 —— 首先学习图像的基本知识(比如白色背景上的灰色圆形物体),然后逐渐变得复杂(如耳朵和尾部),接着是面部,最后越来越接近我们的小猫猫!
▎结果
下面是不同模型生成的图像(不同参数设置 生成的图像是不同的)
当然也有一些翻车的……
感兴趣的话可以点进原文链接看看,Zack 在他的博客中还设置了参数控件,可以让你自行设置参数,并且实时看到生成模型的变化。
另外,还有一篇专业版本 (Expert) 提供给机器学习的人士阅读,真的很贴心了!人家有女朋友不是没有道理的 ~
原作者:Zack Nado
0条评论