本文是根据Andrew Ng的深度学习视频学习,自己总结的。这一系列先只学习关键技术和设计,具体的实例等下一期进行。
一:神经风格转换处相识
这个是个非常激动人心的小领域,也是一个生成模型,能把一个图像的风格迁移到另一个图像上来,能创造出不一样的新数据来,如下图所示。
将S图像的绘画风格迁移到C图像上,既可以得到一个G图像,G图像是按照S图像的风格绘制的C图像,这很激动人心啊,人人都可以成为绘画师了啊简直,在图像处理特效领域完全可以产生新的滤镜。
内容就是图像的组成部分。可能是风景、海滩环境、花园里的猫、动物园里的长颈鹿等等……在典型的图像分类网络中,基本上是图像的标签。内容是图像组成的高级表征。
图像风格涉及更复杂的细节:笔触、颜色对比、整体纹理等等……
假设图像的内容是一只狗,不同人画这个“内容”的方式不一样,也就是说狗的模样会不尽相同。这种差异形成了图像风格。你的笔画可能会更粗更有活力,而我的笔画可能会更细更钝。
在深度卷积网络中,每一个隐含层都可能包含图像的部分内容和风格。
从第一个隐藏层开始可能只能识别简单的纹理特征,线条等信息,到了第二层能够识别比较大的一个曲线纹理特征,到了第三层甚至更高层,就能识别到更加复杂的内容和风格,甚至是更同一隐藏层的不同通道都可以存在不同的内容和风格。
在卷积网络中,图像的内容和风格信息就存在于隐藏层中,随着隐藏层的深入,就可以从最简单的纹理线条到复杂的物体检测。
二:代价函数以及训练过程
代价函数:
由两部分组成,一个是生成图像G和内容图像C的相似度损失值,一个是生成图像G和风格图像S的相似度损失值。
训练过程:
1:初始化一个随机噪声的图像数据G,它可能是 100×100×3,可能是 500×500×3。
2:使用一个训练好了的网络ConvNet,作为深度特征和风格内容的抽取器和计算器。这个网络模型你可以自己训练,或者是利用现有的网络直接拿来使用,毕竟目标不是为了训练这个网络,而是要训练出图像。
3:使用梯度下降来更新输入的图像G,将G的每个像素作为参数,去更新G,注意这里不是训练网络参数了,而是把输入数据作为参数。
这个梯度下降的过程中,就是在更新G的像素,使他能达到一个很小的代价值。
从这里我们也学习到了数据也可以是参数,参数也可以是数据,二者在数学概念上上可以相互转换的。
例如下图
内容图像C是1图,风格图像S是2图,给定一个随机噪声图像G,通过不断地梯度下降迭代后就会得到一个新的图像图6。
三:内容损失函数
四:风格损失函数
什么是风格,在数学上怎么解释这个风格?
图像的风格信息依然存在于深度网络的隐藏层的,因此我们还是和内容代价函数一样第一步挑选一个隐藏层L,用这个隐藏层作为风格的深度测量,假设我们挑选了某个隐藏层如下。
这个隐藏层的高度是NH,宽度是NW,通道数是NC,也就是可以看成是NC个子图像,或者可以说是得到了NC个二维矩阵。
我们现在需要计算各个通道图像之间的相关系数,用相关性来衡量图片的风格,这让我们想到了协方差矩阵,其实跟这个很类似。
如何理解呢?假如通道1图像对应某种纹理,通道2图像对应某种颜色,他们之间的相关性共同构成一个风格,就是此处用了这个纹理,同时也是这种颜色的相关程度。同样的,假设通道3代表是线条粗细的特征,此时计算通道1和通道3之间的相关程度,就可以形成在此纹理下,线条粗细的相关性程度。因此,利用相关性,共同来决定哪些特征(粗细,颜色,纹理等等等)的混合,以及混合比例(相关程度),这就是图像的风格就形成了。
不得不说啊,大神们的数学基础以及逻辑分析能力真是厉害,这些基本数学概念说出来了,我们都知道,但是就是想不出来这东西还能拿来被用作解决和分析高级问题,而大多数的时候我们都是用来考试,前路漫漫啊。
好了,既然我们要求每一个通道和其他通道的相关系数,那结果就是一个矩阵了,NC * NC的一个矩阵,这个矩阵叫做gram 矩阵。
这里我们就直接写计算式得了。首先将L层的(NC,NH,NW)的张量reshape到(NC,NH*NW)的二维向量上,这样做纯属是方便矩阵运算了。
于是分别得到图像S的在L层的二维矩阵N_S,以及得到图像G的在L层的二维矩阵N_G。
到目前为止,我们已经把神经网络转换的训练过程,以及计算过程全部讲解完了。
下一步就是亲自实践一个这样的功能。