把下图content的内容转换成Style风格的图像,结果如下Generate图像所示。
这部分通过一些可视化例子来理解,深度卷积网络在学习一些什么东西。
假如训练了一个能干的豆芽卷积网络,我们来详细看网络隐藏单元
从第一层的隐藏单元开始,假设遍历了训练集,然后发现最大化激活运算单元的图片或图片是什么,换句话说,将你的训练集经过神经网络然后弄明白哪一张图片最大限度地激活特定的单元,在第一层隐藏单元只能看到小部分卷积神经。从第一个隐藏层选择一个单元,并选择出这个单元被最大激活的9个图片块,其它的隐藏层单元重复这个操作。
从下图可以看出第一层的隐藏单元通常会找出一些简单的特征,比如边缘或者颜色阴影,在深层的隐藏单元会看到一个图像更大的部分,在极端的情况下可以假设每个像素都会影响到神经网络更深层的输出
在这一层检测到了更复杂的形状和模式,比如第二个隐藏单元找到了很多的垂直图案。
在第3、4、5隐藏层,我们看到提取的特征越来越复杂,也越来越高阶。
为了实现神经风格变化,需要定义一个损失函数,后续看到的就是怎么去最小化这个损失函数。损失函数的定义如下。
其中G为生成图像,C为内容图像,S为风格图像, J(G) 描述了生成的风格化图美国高防vps像的效果,算法通过梯度下降的方式进行优化。损失函数中包含了两个部分:一部分是 Jcontent(C,G) ,也叫内容损失函数,它度量了生成图像和内容图像的相似度,另一部分是 Jstyle(S,G) ,也叫风格损失函数,定义了生成图像和风格图像的相似性,损失函数中还定义两个超参数 α 和 β ,描述了在生成的风格图像中内容图像和风格图像所占的权重。
如何得到生成图像G呢?你需要随机初始化生成图像G,然后通过梯度下降算法最小化损失函数 J(G) ,所以你可以更新图像G通过如下公式:
G:=G??(G)GJ(G)
下图还给出了一个逐步得到生成图像的示例。
9.内容损失函数
在上一部分已经阐述了神经风格转换的损失函数包含内容损失函数和风格损失函数两个部分,这部分讲述内容代价函数。
1)假如你要用隐藏层 l 来计算内容损失,如果l是一个很小的数,假如用第一个隐藏层来计算内容损失函数,就会使你生成的图像中像素上非常接近内容图片,如果用很深的层那么就会问图像中是否有狗,然后就会确保生成图像中有一个狗,所以在实际中这个层 l 在网络中即不会选的太浅也不会选的太深。
2)用预训练的卷积网络,可以是VGG网络或者其它的网络,现在你需要衡量,加入有一个内容图片和一个生成图片,他们在内容上的相似度
3)令a[l](C)和 a[l](G) 为图像在 l 层的激活函数值
4)如果a[l](C)和 a[l](G) 相似,两个图片有着相似的内容
所以内容损失函数为取 l 层的激活结果,转换成一维向量差值的平方和,然后对J(G)做梯度下降来找G的值时,整个代价函数会激励这个算法来找到图像G使得隐含层的激活值和内容图像的相似
10.风格损失函数
图片的风格具体是什么意思呢?加入我们选择隐藏层 l 来度量图片的风格 ,我们这里把风格定义为隐藏层l各个通道激活函数的相关性。我们这里的意思是,假如你有层 l 的激活值,大小为nH?nW?nC。
图像风格的直观认识,我们以下图红色和黄色圈中的区域为例,如果两个图像所标识的区域相关性高话,那么图像中有垂直纹理的地方有很大可能是橘色的,如果不相关的话那么有垂直纹理的地方很大可能不是橘色的,所以相关系数给出了一种度量,告诉我们不同纹理共同出现的可能性有多大。
风格矩阵的计算:
令 a[l]i,j,k 表示图像在第 l 层,i,j,k位置的激活值,G[l]是一个 nc?nc 的风格矩阵
其实就是两个通道的激活值对应位置相乘并相加,如果k和 k′ 通道不相关那么 Gkk′ 就会很小,如果相关就会很大,S表示是风格图像,所以对于生成图像我们图样可以得到这样一个矩阵,每个元素值和上式子计算方式相同。这样我们就有两个矩阵,分别表示风格图像和生成图像的风格矩阵。
风格损失函数可以写成:
前面的为归一化系数
参考文献
[1] Visualizing and understanding convolutional networks.Zeiler et.al 2013.
71281534