TensorFlow 实战:Neural Style

 

1802816598-5944fdf3c46d5_articlex

Neural Style是一个非常有意思的深度学习应用:输入一张代表内容的图片和一张代表风格的图片,深度学习网络会输出一张融合了这个风格和内容的新作品。

TensorFlow是Google开源的最流行的深度学习框架。作者anishathalye使用TensorFlow实现了Neural Style,并将其开源放在了GitHub上。本文对他的代码进行深入剖析。代码请点这里

Pretrained VGG-19 Model

VGG在2014年的 ILSVRC localization and classification 两个问题上分别取得了第一名和第二名。VGG-19是其中的一个模型,官网上提供了预先训练好的系数,经常被业界用来做原始图片的特征变换。

VGG-19是一个非常深的神经网络,总共有19层,基本结构如下:

 

1553413436-5944fe086d525_articlex

前几层为卷积和maxpool的交替,每个卷积包含多个卷积层,最后面再紧跟三个全连接层。具体而言,第一个卷积包含2个卷积层,第二个卷积包含2个卷积层,第三个卷积包含4个卷基层,第四个卷积包含4个卷积层,第五个卷积包含4个卷基层,所以一共有16个卷积层,加上3个全连接层,一共19层,因此称为VGG-19模型。VGG-19的神经网络结构如下表所示:

4165904504-5944fe10d2f02_articlex

 

Neural Style只依赖于VGG-19的卷积层,需要使用神经网络层列举如下:

我们可以从MatCovNet下载页获取VGG-19模型预先训练好的模型系数文件。该文件为Matlab格式,我们可以使用Python的scipy.io进行数据读取。

该数据包含很多信息,我们需要的信息是每层神经网络的kernels和bias。kernels的获取方式是data['layers'][0][第i层][0][0][0][0][0],形状为[width, height, in_channels, out_channels],bias的获取方式是data['layers'][0][第i层][0][0][0][0][0],形状为[1,out_channels]。对于VGG-19的卷积,全部采用了3X3的filters,所以width为3,height为3。注意,这里面的层数i,指的是最细粒度的层数,包括conv、relu、pool、fc各种操作。因此,i=0为卷积核,i=1为relu,i=2为卷积核,i=3为relu,i=4为pool,i=5为卷积核,……,i=37为全连接层,以此类推。VGG-19的pooling采用了长宽为2X2的max-pooling,Neural Style将它替换为了average-pooling,因为作者发现这样的效果会稍微好一些。

VGG-19需要对输入图片进行一步预处理,把每个像素点的取值减去训练集算出来的RGB均值。VGG-19的RGB均值可以通过np.mean(data['normalization'][0][0][0], axis=(0, 1)获得,其取值为[ 123.68 116.779 103.939]

综上所述,我们可以使用下面的代码vgg.py读取VGG-19神经网络,用于构造Neural Style模型。

Neural Style

Neural Style的核心思想如下图所示:

3537999093-5944fe265d6c4_articlex

 

Part 1: Content Reconstruction

基本思路如下:将content图片p和一张随机生成的图片x,都经过VGG-19的卷积网络进行特征变换,获取某些层级输出的特征变换结果,要求二者的差异最小。二者在l层的损失函数定义如下:

83576422-5944fe359649d_articlex

其中F_{ij}^l为随机图片的第i个卷积核filter在位置j的取值,P_{ij}^l为content图片的第i个卷积核filter在位置j的取值。

计算content图片的feature map逻辑实现如下:

计算随机图片的feature map,并计算content loss的逻辑实现如下:

Part 2: Style Reconstruction

从数学上定义什么是风格,是Neural Style比较有意思的地方。每个卷积核filter可以看做是图形的一种特征抽取。风格在这篇paper中被简化为任意两种特征的相关性。相关性的描述使用余弦相似性,而余弦相似性又正比于两种特征的点积。于是风格的数学定义被表示为神经网络层里filter i和filter j的点积,用G_{ij}^l表示。

3599339845-5944fe49d6a96_articlex

 

与Content Reconstruction中的损失定义相似,我们把style图片和随机生成的噪点图片经过相同的VGG-19卷积网络进行特征变换,选出指定层级的filters。对每个层级,计算两张图片特征变换后$G_{ij}^l$的差异。

2699247720-5944fe55e7af4_articlex

 

各个层级的加权和就是最后的style loss:

2283658494-5944fe5cc2b16_articlex

计算style图片的feature map逻辑实现如下:

计算随机图片的feature map,并计算style loss的逻辑实现如下:

将上述代码有序组合在一起后,可以得到Neural Style TensorFlow代码的第二个关键文件stylize.py

参考资料

1 收藏 评论

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部