用python 6步搞定从照片到名画,你学你也可以(附视频)

近年来,机器学习的进步使我们仅用几行代码就能生成惊为天人的艺术作品。如果可以将艺术作品的原型设计速度提高100倍,让用户真正地与创作媒介合为一体,效果会怎么样呢?

如果我们可以用机器学习的模式来扩展生物学习的模式,那么机器显然不是我们的艺术竞争对手,而是提高我们艺术创造力的途径。

本期,Siraj将教大家通过在Keras中用TensorFlow后端编写Python脚本,把原图像变成任意艺术家的风格,从而实现风格迁移

【雷锋字幕组】招募进行时

我们是一个由海内外优秀开发者组成的志愿者团队,致力于经典机器学习课程及AI前沿学术成果传播,有着完善的入组学习机制和丰富的资源福利。如果你热衷于AI技术学习和分享,那你还在等什么?快来加入我们吧!欢迎添加组长微信 jadelover11 加入字幕组~

1. 图像的张量表示

要用的一幅原图以及一幅风格图,将原图进行风格转化:

首先将图片输入神经网络,将它们转换为同一数据格式,Keras后端TensorFlow的变量函数等价于tf.variable。该参数将表示转换为数组的图像,然后我们将对风格图像执行相同的操作,创造出一个以后可以存储最终结果的组合图像,然后使用占位符用给定的宽度和高度初始化。

2. 将三张图片合并到一个Keras张量作为输入

使用 concatenate 连接函数执行此操作。

3. 用3个图像作为输入创建VGG16网络

将输入设置为新创建的张量,并将权重设置为imagenet,设置include_top = False。

VGG16是由牛津大学视觉几何团队创建的16层卷积网络,赢得了2014年的ImageNet大赛。他们的想法是对数千个不同图像进行图像分类的预先训练的卷积网络。

已经知道如何对图像中包含的信息进行编码,它在每一层都可以通过学习过滤器来检测出某些通性,我们将利用过滤器来执行风格转换,而不需要顶部卷积层的原因是因为它的完全连接层和softmax函数,通过压缩维度特征映射来帮助图像进行分类并输出概率。

我们将把风格迁移任务用优化问题表示,用损失函数来衡量想要最小化的误差值。在这种情况下,损失函数可以分解为两个部分:内容损失风格损失。把总损失初始化为零,并将两种损失都添加到其中。

  • 内容损失

可以认为图像包括风格部分和内容部分。我们知道 CNN的学习特征是按照渐进的抽象成分排列的,由于更高层次的特征是更抽象的。所以检测人脸没有那么抽象,可以把它们与内容联系起来,让它们检测构成图像的对象。分别通过网络运行输出图像和参考图像时,将从各自选择的隐藏层中获得一组特征表示,然后测量它们之间的欧氏距离以计算损失。

  • 风格损失

这仍然是一个网络的隐藏层输出的函数,但稍微复杂一些。我们还是通过网络观察两个图像的激活情况,但将添加额外的步骤来度量激活的相关性而不是直接比较原始的激活内容。对于这两个图像 ,我们将在网络中的给定层获取激活的Gram矩阵。它是用一个给定层的所有激活的内积来计算的,这些激活是一组向量 ,每一个向量表示一个特征。

因此 ,这个结果矩阵包含了给定层的每一对特征映射之间的相关性,它代表了在图像的不同部分中共同出现的特征趋势。一旦有了这个 ,就可以将风格损失定义为参考图像和输出图像的Gram矩阵之间的欧氏距离。我们会计算选择的每一层的风格损失的加权总和把它作为总的风格损失。

事实证明,就风格而言,像内容损失那样只用一个单层损失效果并不理想。而当使用多个层时,效果会有所改善。

接下来定义输出图像对于损失的梯度,然后利用梯度来不断地改进输出图像以最小化损失。所以将计算出给定层中损失对激活的导数,以得到梯度来更新输出图像,而不是权重。梯度给出了如何更新输出图像的方向,这样一来原图和风格图像的区别就变小了。

4. 将损失函数合并为单个标量

调用助手类组合损失函数并给出它的模型和,输出图像作为参数。

5. 得到关于损失的输出图像的梯度

利用Keras的梯度函数,在后台转换为tf.gradients。这就给出了一个张量关于一个或多个其他张量的符号梯度。

6. 在输出图像的像素上运行优化算法(L-BFGS)以最小化损失

这与随机梯度下降很相似,但收敛速度更快。把计算出的梯度输入最小化函数,它就能输出结果图像,让我们看看是什么样的!

一些手机应用也在做这个,例如Prisma可让用户在移动设备上选择过滤器,Artisto甚至支持将滤镜应用到视频中。我们还处于使用机器学习创造艺术的早期阶段,所以这个领域仍然有很多机会。

原文发布于微信公众号 - AI研习社(okweiwu)

原文发表时间:2017-07-17

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏机器学习算法工程师

如果Boosting 你懂、那 Adaboost你懂么?

作者:崔家华 编辑:王抒伟 转载请注明作者和出处: https://zhuanlan.zhihu.com/ml-jack 机器学习知乎专栏: h...

37550
来自专栏目标检测和深度学习

入门 | 从零开始,了解元学习

10010
来自专栏Petrichor的专栏

深度学习: 感受野 (receptive field)

感受野的计算 主要与 卷积层 和 池化层 的 窗口大小 (size)、移动步长 (stride) 以及 填充 (padding) 有关。

62430
来自专栏机器之心

学界 | 在有池化层、1步幅的CNN上减少冗余计算,一种广泛适用的架构转换方法

28350
来自专栏机器之心

你是合格的机器学习数据科学家吗?来挑战这40题吧!(附解答)

选自 Analytics Vidhya 作者:ANKIT GUPTA 机器之心编译 参与:机器之心编辑部 目前机器学习是最抢手的技能之一。如果你是一名数据科学...

39390
来自专栏机器之心

从90年代的SRNN开始,纵览循环神经网络27年的研究进展

287120
来自专栏华章科技

你是合格的机器学习数据科学家吗?来挑战这40题吧!(附解答)

目前机器学习是最抢手的技能之一。如果你是一名数据科学家,那就需要对机器学习很擅长,而不只是三脚猫的功夫。作为 DataFest 2017 的一部分,Analyt...

10620
来自专栏PPV课数据科学社区

机器学习系列:(九)从感知器到支持向量机

从感知器到支持向量机 上一章我们介绍了感知器。作为一种二元分类器,感知器不能有效的解决线性不可分问题。其实在第二章,线性回归里面已经遇到过类似的问题,当时需要解...

44790
来自专栏PPV课数据科学社区

谷歌最新机器学习术语表,A/B 测试 、混淆矩阵、决策边界……都在这里了!

日前,谷歌发布机器学习术语表,以下术语表中列出了一般的机器学习术语和 TensorFlow 专用术语的定义。 A A/B 测试 (A/B testing) 一种...

33460
来自专栏灯塔大数据

原创译文|从神经网络说起:深度学习初学者不可不知的25个术语和概念(下)

人工智能,深度学习和机器学习,不论你现在是否能够理解这些概念,你都应该学习。否则三年内,你就会像灭绝的恐龙一样被社会淘汰。 ——马克·库班(NBA小牛队老板,...

47070

扫码关注云+社区

领取腾讯云代金券