神经风格迁移指南(第一部分)

本文为 AI 研习社编译的技术博客,原标题 : Neural Style Transfer Tutorial -Part 1 作者 | Vamshik Shetty 翻译 | 杨惠淳、nanly、老赵 校对 | 酱番梨 整理 | 菠萝妹 原文链接: https://towardsdatascience.com/neural-style-transfer-tutorial-part-1-f5cd3315fa7f

神经风格迁移指南 - 第一部分

神经风格迁移学说

在本系列中,我们会从神经风格的基础开始,你将从中学到一种自下而上(从基础开始)的方法。对于初学者而言,我们将会详细讲解神经风格到底是什么,以及它的工作原理。本文是连载中的系列文章的第一部分,将由我与 Pawan Sasanka Ammanamanchi 共同完成。本系列长期连载,我们将努力覆盖这个领域的研究,并且不断增加新的文章。目前,实现这一目标的先决条件如下:

  1. Python
  2. 基本理解卷积神经网络的工作原理.如果你对这些知识(卷积神经网络)不是很了解,我们建议你看一下这篇文章卷积神经网络.

那么,风格迁移是什么意思呢?

在过去几年里,有一些APP涌现出来,例如Prisma等等,可以把照片风格化,看起来就像是一幅画一样。这些为你提供非常多漂亮的艺术风格,就像是梵高所画的《星夜》。让我用文字来阐释背后的原理其实是不容易的。

图1

如同你在图一中看到的,两张图片一张是负责提供内容的,另一张是负责提供图像风格的,这两张用来生成一张全新的图片,这张图就被称为经过风格化的图片。关于这张图片有一些需要注意的地方,这张图片在保留了原有内容的基础上融合了风格图的特色。新的图片看上去很棒,并且我们可以十分确定这不是简单的将两张图片重叠起来得到的。那么问题就在于我们是如何实现的,这背后又使用了哪些数学理论。要回答这个问题,我们需要先退后一步,思考下别的问题,卷积神经网络学习到的到底是什么?这些卷积层以特征图或者卷积核形式进行编码的到底是什么?我们输入一张图片的时候,卷积网络学习到了什么表征?让我们先来搞清楚这些问题。

卷积神经网络最初被设计用来进行图片分类工作,最近它也被应用到了其他诸如图片分割,图像风格迁移及其他有关计算机视觉方面的任务上,当然也有被用于自然语言处理的例子。卷积神经网络是深度学习中最能够被解释的模型之一,因为我们可以将他们的表征可视化从而理解他们可能学到的东西。

我们能从卷积神经网络中得到什么启发呢?

这一部分我想分享一些直观的关于卷积神经网络的深度层如何表示一张图片,同时我们又是如何使用这些只对模型有意义的表征来进行图像风格迁移的。我们就用这个VGG16结构来理解隐藏层中的表征。

图2

使用上述架构作为参考,让我们考虑vgg16的第一个卷积层,它使用3x3内核并训练64个特征映射,通过将大小为224x224的3通道图像作为输入来生成224x224x64的图像表示。 如果你有点困惑,请看下面:

图3

让我们假设在训练这64个特征图时,它们可能已经学会了检测简单模式,这样一些神经元在看到一条直线时会激活,或者甚至是某些其他类型的模式,这样一些神经元在他们看到一条直线时会激活,或者甚至会出现一些其他类型的图案,这些图案可能对人眼没有任何意义,但对这个模型有很大的价值。直线或某些模式的这种“检测”被称为学习特征表示。

现在让我们考虑vgg16的第10个卷积层,它使用带有512个特征映射的3x3内核进行训练,最后生成28X28x512图像表示的输出,为了简单起见,我们假设第10层中有某些单位被激活, 包含像汽车轮子的圆圈的图像,或者可能有一些图像被具有类似于三条相交线等的图案的图像激活。

图4-卷积网络可视化和理解

可以安全地假设 CNN 没有学会编码什么图像,但它实际上学习编码图像代表什么或图像中可见的内容,并且由于神经网络的固有非线性特性,我们从浅层到更深层的隐藏单元能够从给定图像中检测出越来越复杂的特征。

这些图像表示如何帮助进行风格转换?

那么编码表示本身的这种性质是风格转移的关键,它用于计算生成的图像与内容和样式图像之间的损失。由于每个类在数万个图像上训练模型,因此模型能够为许多不同的图像生成相似的特征表示,因为它们属于同一类或具有相似的内容或样式。因此,使用生成的图像的特征表示的值与内容和样式图像的差异来指导我们生成生成的图像本身的迭代是有意义的但是我们如何确保内容图像(C)和生成的图像(G )在内容方面是相似的而不是风格,而另一方面,我们如何确保生成的图像仅从样式图像(S)继承类似的样式表示而不是整个样式图像本身。这可以通过将损失函数分为两部分来解决,一部分是内容损失,另一部分是风格损失,很快我们就会理解它们彼此之间的差异以及它们如何克服我们提出的问题。

损失函数

图5

正如在上面的等式中所看到的,我们需要计算两件事来获得整体损失,即内容损失和风格损失,alpha 和 beta 超参数用于为每种类型的损失提供权重,即这些参数可以被简单认为是作为旋钮来控制我们想要在生成的图像中继承多少内容/风格。 因此,让我们了解每个损失术语的含义。

上面显示的此损失函数的输入是什么? 我们不知道最终输出的外观。 因此,监督学习的朴素方法可能行不通。 答案在于下图。

图6-用于内容,风格和生成图像的不同表示

在每次迭代期间,所有三个图像,即内容图像,风格图像和生成图像都通过vgg16模型。 在某些层上对给定图像的特征表示进行编码的隐藏单元的激活值被视为这些损失函数的输入,简单来说,你可以直接将其视为在VGG16网络中获取图层的输出, 关于选择图层的任何硬性规则。 在这里注意另一件事,最初我们随机初始化生成的图像,如果你看它然后它只不过是一个形状与内容图像相同的随机噪声矩阵。 每次迭代我们都会更改生成的图像,以尽量减少总体损失L。

注意:在每个卷积层之后,它的输出通过 relu 作为激活函数传递,你也可以在图2中查看每个卷积块被表示为 [Convolution + Relu]。

内容损失

内容损失很容易计算,让我们只考虑其中一个层的特征表示,让我们考虑vgg16的第7个卷积层。 为了计算内容损失,我们通过vgg16传递内容图像和生成的图像,并获得这些图像的第7个转换层的激活值(即输出),这些图像用 Relu 激活,我们将该图层的输出通常表示为 relu_3_3,因为 它是第三组/第三组卷积的第三转换层的输出(参见图2和图6以供参考)。 最后,我们发现这两个激活矩阵之间的元素减法的 L2 范数,这将有助于通过确保最小化特征表示的差异来保持所生成图像中的原始内容,所述特征表示在逻辑上集中于两个图像的内容之间的差异。

把这种损失用在数学形式或我们可以计算的方程中。 假设我们有函数内容损失,它接受三个参数作为输入,即内容图像 C ,生成的图像 G 和层 L,其激活我们将用于计算损失。 现在让我们将内容图像的每个激活层表示为 [L](C)并将生成的图像的激活层表示为 [L](G)。

图7

风格损失

现在让我们看一下风格损失,在计算风格损失时,我们将考虑从模型的浅层到更深层的许多卷积层的特征表示。 与内容损失不同,我们不能仅仅找到激活单元的差异,我们需要的是在同一层的不同通道中找到这些激活之间的相关性的方法,为此我们需要一些称为Gram Matrix的东西。

什么是Gram矩阵?

我将尝试用一个例子来构建理解 gram 矩阵所需的基础,所以让我们考虑通过 vgg16 传递我们的风格图像,我们从第7层获得激活值,生成大小为56x56x256 的特征表示矩阵,你可以参考图2描述的 vgg16 的体系结构。 现在让我们仔细看看这个输出。

图8

在这个3-D阵列中,有256个通道,每个通道大小为56x56。 现在让我们假设有一个通道 'A',当它们遇到包含黑色和棕色条块的图像区域时,它们的激活单元可能被激活,然后有一个通道 'B',当它们遇到类似眼球的东西时,它们的激活单元可能被激活。

注意:这里激活的单位指的是它们在通过 relu 之后具有相当大的值而不是零。

如果这两个通道 'A' 和 'B' 同时为相同的输入激活,则图像可能包含虎脸(因为它有两个高值的通道,可激活眼球和棕黑色条纹)。 现在,如果这两个通道都以高激活值启动,这意味着它们与通道 'A' 和 'C' 之间的相关性相比具有高相关性,其中通道 'C' 可能在看到菱形图案时被激活。 这个想法背后的逻辑是两个大数的乘法是大的,而两个小数或大数和小数的乘法相对较小。 所以相关性告诉我们这些高级纹理/图案中的哪一个发生或不发生在一起。

因此,为了获得所有这些通道的相互关系,我们需要计算一些称为 gram矩阵的东西,我们将使用 gram 矩阵来测量通道之间的相关程度,这些通道随后将作为风格本身的度量。 现在你可能已经理解了 gram 矩阵的重要性,但是要理解我们如何得到上述三维数组的 gram 矩阵,请通过下面提到的图像。

图9- Gram 矩阵 G

现在你可以看到这个 gram 矩阵的每个元素如何包含所有通道相对于彼此的相关性度量。 接下来,我们如何使用这个计算的 Gram 矩阵 G 来计算风格损失。 让我们将层 L 的风格图像的 gram 矩阵表示为GM [L](S),并将生成图像的 gram 矩阵表示为 GM [L](G)。 gram 矩阵都是从同一层计算的,因此使用相同数量的通道使其成为大小为 ch x ch 的矩阵。现在,如果我们找到这两个矩阵的元素减法的平方差或 L2_norm 的总和,并尝试最小化 。然后,这最终将导致最小化风格图像样式和生成图像之间的差异。 想一想,它可能需要一些时间来解决,但是当它确实存在时,你会被这简单而有效所迷惑。

图10-单层 L 的风格损失

在上面的等式中,N 下标 l 表示层1的特征图/输出中的通道数,M 下标 l表示层1的特征图/输出的高度*宽度。

在计算风格损失时,我们使用多个激活层,这种情况使我们有可能为不同层提供的每个子损失分配不同的权重。 在下面的等式中,总结我刚才所说的,但在我们的情况下或大多数情况下,一般人们给予所有层次相同的权重。

图11

下一步是什么 ?

一旦你有内容和风格损失,前向移动就会添加它们并使用任何优化器来执行梯度下降来更改生成图像,以便在每次迭代后减少它的损失。

这几乎总结了一下,我希望我的解释足以消除你对神经风格基础的疑虑。 现在你可以深入研究神经风格的代码,我将浏览我的代码的每一行并正确地剖析它,但是下面提到的伪代码几乎总结了你将要运行和使用的代码。

原始论文通常使用以下内容和风格图层,但你也可以尝试其他图层。

这是神经风格的本质。 如果你对本文的任何部分仍有疑问或想要更好的解释,请在下面发表评论,我会尽尽快回复你。

学习快乐。

原始神经风格转移的链接:Leon A. Gatys“艺术风格的神经算法”。

你可以期待以下文章。

使用Tensorflow和pyTorch进行神经风格转换的课程:

第1部分 - 神经风格转移理论

第2部分 - 神经风格转移的实施

第3部分 - 快速神经风格转移的实现

第4部分 - 深度照片

第5部分 - 人脸神经风格转换理论

第6部分 - 面部神经风格转移的实现

感谢阅读本文。

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

原文发表时间:2018-11-23

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SIGAI学习与实践平台

流形学习概述

在很多应用中,数据的维数会很高。以图像数据为例,我们要识别32x32的手写数字图像,如果将像素按行或者列拼接起来形成向量,这个向量的维数是1024。高维的数据不...

21040
来自专栏包子铺里聊IT

经典智能算法快速入门之神经网络——技术篇

在上一篇文章里,小编给大家概括地介绍了下神经网络的历史和应用。这次,小编要给大家细细讲解下神经网络的组成,和几种常见神经网络的模型及其适用领域。 基本组成 顾名...

39490
来自专栏智能算法

初识支持向量机原理

支持向量机作为机器学习中最为难于理解的算法,小编将以三篇的篇幅去讲解小编自己理解的SVM算法。主要包括:初识支持向量机原理、SVM如何解决线性不可分、SVM实践...

35660
来自专栏技术随笔

[译] Precomputed Real-Time Texture Synthesis with Markovian Generative Adversarial Networks

41960
来自专栏量子位

机器学习萌新必学的Top10算法

在机器学习领域里,不存在一种万能的算法可以完美解决所有问题,尤其是像预测建模的监督学习里。 ? 比方说,神经网络不见得比决策树好,同样反过来也不成立。 最后的结...

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

收藏!机器学习与深度学习面试问题总结.....

后向传播是在求解损失函数L对参数w求导时候用到的方法,目的是通过链式法则对参数进行一层一层的求导。这里重点强调:要将参数进行随机初始化而不是全部置0,否则所有隐...

15320
来自专栏企鹅号快讯

机器学习算法实战

目 录 逻辑回归算法步骤简述 选择输入函数:sigmoid函数 选择优化算法:梯度上升法 观察数据集 批梯度上升训练 随机梯度上升训练 推荐阅读时间: 10m...

24350
来自专栏杂七杂八

梯度下降

梯度下降(Gradient Descent)是在求解机器学习算法的模型参数(无约束优化问题)时,最常采用的方法之一 代价函数 提到梯度下降就不得不说一下代价函...

31450
来自专栏机器人网

强大的卷积网络是如何运行?

首先,卷积网络认知图像的方式不同于人类。因此,在图像被卷积网络采集、处理时,需要以不同方式思考其含义。 卷积网络将图像视为体,也即三维物体,而非仅用宽度和高度测...

29080
来自专栏AI科技大本营的专栏

技术 | 变形卷积核、可分离卷积?卷积神经网络中十大拍案叫绝的操作

作者 | Professor ho CNN从2012年的AlexNet发展至今,科学家们发明出各种各样的CNN模型,一个比一个深,一个比一个准确,一个比一个轻量...

33250

扫码关注云+社区

领取腾讯云代金券