神经风格转移

文章目录
  1. 1. 简介
  2. 2. 深度卷积网络在学什么?
  3. 3. 代价函数
  4. 4. 内容代价函数
  5. 5. 风格代价函数
  6. 6. 推广至一维和三维

简介

神经风格迁移(Neural style transfer)将参考风格图像的风格“迁移”到另外一张内容图像中,生成具有其特色的图像。

相关链接:


深度卷积网络在学什么?

想要理解如何实现神经风格转换,首先要理解在输入图像数据后,一个深度卷积网络从中都学到了些什么。我们借助可视化来做到这一点。

我们通过遍历所有的训练样本,找出使该层激活函数输出最大的 9 块图像区域。可以看出,浅层的隐藏层通常检测出的是原始图像的边缘、颜色、阴影等简单信息。随着层数的增加,隐藏单元能捕捉的区域更大,学习到的特征也由从边缘到纹理再到具体物体,变得更加复杂。

相关论文:Zeiler and Fergus., 2013, Visualizing and understanding convolutional networks


代价函数

神经风格迁移生成图片 G 的代价函数如下:

$$J(G) = \alpha \cdot J_{content}(C, G) + \beta \cdot J_{style}(S, G)$$

其中,$α$、$β$ 是用于控制相似度比重的超参数。

神经风格迁移的算法步骤如下:

  1. 随机生成图片 G 的所有像素点;
  2. 使用梯度下降算法使代价函数最小化,以不断修正 G 的所有像素点。

相关论文:Gatys al., 2015. A neural algorithm of artistic style


内容代价函数

上述代价函数包含一个内容代价部分和风格代价部分。我们先来讨论内容代价函数 $J_{content}(C, G)$,它表示内容图片 C 和生成图片 G 之间的相似度。

$J_{content}(C, G)$ 的计算过程如下:

  • 使用一个预训练好的 CNN(例如 VGG);
  • 选择一个隐藏层 l 来计算内容代价。l 太小则内容图片和生成图片像素级别相似,l 太大则可能只有具体物体级别的相似。因此,l 一般选一个中间层;
  • 设 a(C)[l]、a(G)[l] 为 C 和 G 在 l 层的激活,则有:

$$J_{content}(C, G) = \frac{1}{2}||(a^{(C)[l]} - a^{(G)[l]})||^2$$

$a^{(C)[l]}$ 和 $a^{(G)[l]}$ 越相似,则 $J_{content}(C, G)$ 越小。


风格代价函数

每个通道提取图片的特征不同,比如标为红色的通道提取的是图片的垂直纹理特征,标为黄色的通道提取的是图片的橙色背景特征。那么计算这两个通道的相关性,相关性的大小,即表示原始图片既包含了垂直纹理也包含了该橙色背景的可能性大小。通过 CNN,“风格”被定义为同一个隐藏层不同通道之间激活值的相关系数,因其反映了原始图片特征间的相互关系。

对于风格图像 S,选定网络中的第 l 层,则相关系数以一个 gram 矩阵的形式表示:

其中,$i$ 和 $j$ 为第 $l$ 层的高度和宽度;$k$ 和 $k′$ 为选定的通道,其范围为 1 到 $n_C^{[l]}$;$a^{l}_{ijk}$ 为激活。

同理,对于生成图像 G,有:

因此,第 $l$ 层的风格代价函数为:

如果对各层都使用风格代价函数,效果会更好。因此有:

$$J_{style}(S, G) = \sum_l \lambda^{[l]} J^{[l]}_{style}(S, G)$$

其中,$lambda$ 是用于设置不同层所占权重的超参数。


推广至一维和三维

之前我们处理的都是二维图片,实际上卷积也可以延伸到一维和三维数据。我们举两个示例来说明。

EKG 数据(心电图)是由时间序列对应的每个瞬间的电压组成,是一维数据。一般来说我们会用 RNN(循环神经网络)来处理,不过如果用卷积处理,则有:

  • 输入时间序列维度:14 x 1
  • 滤波器尺寸:5 x 1,滤波器个数:16
  • 输出时间序列维度:10 x 16

而对于三维图片的示例,有

  • 输入 3D 图片维度:14 x 14 x 14 x 1
  • 滤波器尺寸:5 x 5 x 5 x 1,滤波器个数:16
  • 输出 3D 图片维度:10 x 10 x 10 x 16