欢迎转载,作者:Ling,注明出处:深度学习:原理简明教程16-深度学习:CNN风格迁移

 

本文主要讨论风格迁移问题。

主要内容参考Andrew NG。

 

什么是神经风格迁移?

dl_16_001

一张提供内容的图片和一张提供风格的图片,生成一张含原来内容并且带有另一张图片风格的新图片。

 

如何做到这样的效果?

首先:我们看看CNN网络中间的layer都能学到什么。如何对CNN各种内容进行可视化后面我会用专门的文章介绍,这里仅适用可视化结果来说明问题。

论文:[Zeiler and Fergus., 2013, Visualizing and understanding convolutional networks]介绍了一种通过unpooling,反卷积的方式得到中间层的可视化图。

简单说过程就是:输入图片,然后得到各个中间层,然后通过unpooling和反卷积还原中间层对应的原始图(注意,得到的原始图非原来的输入图片,因为中间层是提取了特定特征的,还原回去原始图只是原来输入图片对应特征的部分),就得到了可视化的原始图,原始图可以说明该图片得到的中间层,实际学到了什么东西。

dl_16_002

dl_16_003

解释:

除了第一层,其他层,左边每个格子是输入某张图片,得到中间layer i可视化出来的结果,而他们对应右边彩色图相应格子是将它们通过unpooling和反卷积还原出来的彩色图片。注意每个格子都是一个训练样本得到的结果。不同格子是不同训练样本的结果。

第一层,一个格子对应彩色的九个格子,稍微有点不一样。

通过分析我们可以知道

越早的层,可视化结果越简单,比如是edge,颜色,深浅等特征,越深的层越抽象,是前面层的组合,形成更接近实际物体的东西。

从layer 1、layer 2学习到的特征基本上是颜色、边缘等低层特征;layer 3则开始稍微变得复杂,学习到的是纹理特征,比如上面的一些网格纹理;layer 4学习到的则是比较有区别性的特征,比如狗头;layer 5学习到的则是完整的,具有辨别性关键特征。

这告诉我们,一幅图的内容,可以用比较深的某层特征来表示。而风格可以用风格图的中间各个层的特征来表示,这样就可以得到含有图一内容和图二风格的新的图。

论文:[Gatys et al., 2015. A neural algorithm of artistic style. Images on slide generated by Justin Johnson]

dl_16_004

对应的损失函数为:

dl_16_005

解释:

式子左边是生成图的损失,右边包含两部分,一部分是内容图和生成图的损失,风格图和生成图的损失,即内容图和生成图内容是否相似,风格图和生成图风格是否相似。

下面我们依次讨论左边这两个式子。

内容损失函数

1)选取比较后的一个中间层作为内容学习层,因为比较后的层更加抽象接近内容图片。

2)可以使用一个预训练好的CovNet,比如(VGG)

3)则公式如下:

dl_16_006

风格损失函数

风格可以考虑多个层。

对于第l层,如何衡量其风格?

一种方法称为风格相关性

dl_16_007

如上图,是风格图片在某层的输出结果。

第二行的图,每九个属于一个channel

风格相关性认为,一个图片的风格可以用某层不同channel之间激活函数的结果之间的关系表示,即一个图的某种风格取决于,同一层,不同channel之间的关系,如图圈出来的结果,可能“出现竖和出现橙经常同时存在属于某种风格”

来自两个channel之间的激活值可以用一个矩阵表示:

dl_16_008

如果生成图和风格图有类似风格,则他们的风格相关性要比较接近。

dl_16_009

最后得到:

dl_16_010

用梯度下降法求参数