当前位置: 首页 > article >正文

深度学习基础—神经风格迁移

1.什么是神经风格迁移


        神经风格迁移就是将一张图片的风格迁移到另一张图片上,生成具有第一张图片风格的新的图片。新图片的主体还是第二张图片,但是风格是第一张图片的。

        如下两组图片都是神经风格迁移的例子:

        将绘画的风格迁移到真实建筑图片中,得到具有绘画风格的建筑图片。为了实现神经风格迁移,我们需要知道卷积网络提取的特征,在不同的神经网络,比如深层的、浅层的。

2.CNN特征可视化


        这一部分,我们将通过可视化来了解一下深度卷积网络学习的内容究竟是什么?

        假如训练了一个卷积神经网络,是一个Alexnet,轻量级网络,我们将看到不同层之间隐藏单元的计算结果。

        来看看第一层的隐藏单元,假设网络遍历了训练集,然后找到使得单元激活最大化的一些图片或图片块。注意在第一层的隐藏单元,只能看到小部分卷积神经,如果要画出来哪些激活了激活单元,只有一小块图片块是有意义的,因为这就是特定单元所能看到的全部。我们选择一个隐藏单元,发现有9个图片最大化激活,然后就可能找到编号1这样的第一行的图片块(这是3个不同的第一层隐藏单元的输出),主要都是色块边界。编号2出现了一个和其他8个图片不一样的特征,由红色和绿色组成的边界。最终,我们可视化了9个隐藏单元的特征图片,如下所示:

        可以发现,第一层主要学习一些简单的特征,比如边缘或者颜色阴影。接下来我们可视化深层的网络输出:

        这是前五层的可视化结果,我们放大第二层隐层单元可视化结果研究一下网络学习的内容:

        第二层检测到更复杂的形状和模式,比如编号1的隐藏单元,检测到很多垂线的垂直图案,编号2似乎检测到在左侧有圆形图案,编号3检测到细的垂线或斜线。

        将第三层的可视化内容放大,编号1似乎对图像左下角的圆形很敏感(车轮等),所以检测到很多车。编号2似乎开始检测到人类,编号3似乎检测特定的图案,蜂窝状或方形,类似这样规律的图案。有些难以看出来,需要手动弄明白检测到什么,但是第三层明显检测到更复杂的模式。

        第四层已经能检测到更明显、更复杂的特征了,编号1检测到狗狗,编号2似乎检测到水,有湖水或者积水,编号3似乎检测到鸟的脚等等。

        第五层检测到更加复杂的事物,编号1似乎是一个狗检测器,但是可以检测到的狗似乎更加多样性。编号2可以检测到键盘或者是键盘质地的物体,可能是有很多点的物体,比如垃圾桶底。编号3可能检测到文字,编号4检测到花。

        总结:可以发现,卷积网络随着变深,每一层学到的特征更加复杂,因此在最终层才可以保证完成复杂的任务,比如图像识别。

3.代价函数


        要构建一个神经风格迁移系统,就需要定义一个代价函数,通过最小化代价函数,可以生成任何想要的图像。

        现在做如下假设,将内容图片定义为C,风格图片定义为S,生成图片定义为G,则可以定义如下代价函数:

        其中,content部分表示内容图片C和生成图片G之间的代价函数,style部分表示风格图片S和生成图片G之间的代价函数。α和β表示权重,是超参数。

        算法的运行如下:

        首先随机生成一副图片,这里假设100*100*3,也就是编号3表示的随机选取像素的白噪声图。然后运行梯度下降法,最小化代价函数J(G),最终得到编号6所示的生成图片。而编号1表示内容图片C,编号2表示风格图片S。

        下面我将拆开代价函数,依次讲讲内容代价函数和风格代价函数的细节。

4.内容代价函数


        假设用隐含层来计算内容代价,如果层数很浅,比如用隐含层1,这个代价函数就会使生成图片非常接近内容图片。然而如果层数很深,那么代价函数就会保证生成图片中的主体内容非常接近内容图片,比如内容图片是金字塔建筑,那么生成图片也包含金字塔。在实际中,这个层在网络中既不会选的太浅也不会选的太深。然后用一个预训练的卷积模型,比如VGG网络或者其他的网络。

        现在,我们假设已经选了l层隐含层,此时就需要用相似度衡量内容图片C和生成图片G的相似程度,如下:

        选择l层得到的生成图片的激活向量,将生成图片的激活向量和内容图片的激活向量取L2范数的平方,前面乘上1/2或者其他归一化手段(也可以不这样干,因为我们也可以用超参数控制),通过梯度下降法,生成的G会很接近内容图片C。

5.风格代价函数


        在上图中,假设选择l层进行风格代价计算,那么我们就需要定义l层各个通道的激活值之间的相关系数。比如下图,我们取出l层的激活值,它的形状是nh*nw*nc的立方体,nc是通道数。

        现在假设nc=5,即有5个通道,取红色通道和黄色通道,那么我们就要取不同通道相同位置的激活值对,比如都选择右下角(编号1)。而其他位置的不同通道间也组成了许多数字对(编号2,3),这些不同通道间数字对有何含义?就需要用到特征可视化的分析了。

        在特征可视化部分我们提到,编号1的通道表示的神经元可能会提取到编号3所示的垂直纹理信息,编号2的通道表示的神经元可能会提取到编号4所示的橙色背景信息。那么,当不同通道间的激活值呈现高相关性时,那么下图中出现垂直纹理的地方也会出现橙色;如果不相关,那么垂直纹理大概率不是橙色的。即相关系数描述了两个通道提取的特征在一张图片同时出现的可能性。

        为了定义风格代价函数,我们首先定义风格图像的相关系数矩阵,如下是风格图像S和第l层的矩阵:

        k和k’表示不同的通道,i和j表示某个通道下的激活值的坐标,a表示该下标下的激活值,即该公式将(i,j,k)和(i,j,k’)下标的激活值相乘,然后累加求和,得到矩阵G的(k,k’)下标的元素,从而得到nc*nc维度的矩阵G(因为有nc个通道,因此k和k’分别都可取nc个值,因此矩阵的维度是nc*nc)。

        注意:严格来说,它是一种非标准的互相关函数,因为我们没有减去平均数,而是将它们直接相乘。在线性代数中这种矩阵有时也叫Gram矩阵。

        按照相同的操作再对生成图像G进行相关系数矩阵进行计算,公式如上。

        注意:如果两个通道中的激活项数值都很大,那么G矩阵也会变得很大,对应地,如果他们不相关那么就会很小。

        有了风格图像和生成图像的相关系数矩阵,就可以定义风格代价函数,如下所示:

        该函数将两个矩阵计算误差,再乘归一化常数,实际上是计算两个矩阵对应元素相减的平方的和,我们把这个式子展开,从k和k’开始作它们的差,把对应的式子写下来,然后把得到的结果都加起来,再在外面加一个平方,但是一般情况下可以不用归一化常数,只要将它乘以一个超参数就行。

        实际上,如果对各层都使用风格代价函数,结果可能变得更好。如果要对各层都使用风格代价函数,那就定义代价函数,把各个层的结果(各层的风格代价函数)都加起来,这样就能定义它们全体了。我们还需要对每个层定义权重,也就是一些额外的超参数,我们用λ来表示。这样能够在网络中使用不同的层,比如浅层的一些可以测量类似边缘这样的低级特征的层以及深层能测量高级特征的层,使得我们的网络在计算风格时能够同时考虑到这些低级和高级特征的相关系数。

        接下来将风格代价函数和内容代价函数带入下式,就得到了神经风格迁移的代价函数:

        使用梯度下降法或更复杂的优化算法来找到一个效果好的生成图像G,并计算J(G)的最小值,最终得到我们想要的图像。


http://www.kler.cn/news/359992.html

相关文章:

  • PCL 基于中值距离的点云对应关系(永久免费版)
  • 我常用的两个单例模式写法 (继承Mono和不继承Mono的)
  • 通过SSH远端免密登录执行脚本,修改最新5分钟生成文件权限
  • 离散数学 第二讲 特殊集合和集合间关系 笔记 [电子科大]王丽杰
  • uniapp 常用的地区行业各种多选多选,支持回显,复制粘贴可使用
  • 使用HIP和OpenMP卸载的Jacobi求解器
  • Netty笔记
  • 【论文学习与撰写】,论文word文档中出现乱码的情况,文档中显示的乱码,都是英文字母之类的,但打印预览是正常的
  • Flutter 11 Android原生项目集成Flutter Module
  • 判断索引对象中所有元素是否都为真值pandas.Index.all()
  • 【DBA Part01】国产Linux上安装Oracle进行数据迁移
  • opencv 图像缩放操作 - python 实现
  • 【STM32 HAL库】MPU6050姿态解算 卡尔曼滤波
  • vue富文本使用editor
  • Docker 部署 JDK11 图文并茂简单易懂
  • vbs给qq发送消息
  • redis IO多路复用机制
  • 光伏行业如何借助ERP领跑绿色经济?
  • 【人工智能】一文掌握具身智能机器人的仿真平台,再也不需要东奔西走了。
  • Halcon开启多线程