本笔记是风格转换应用的概述。
本应用需要使用使用已训练好的VGG16网络的结构及参数。VGG16.npy文件中保存了网络的结构和参数,这些参数可以通过解析网络得到,之后便可以重构整个网络,包括每一个conv layer,每一个pooling layer,每一个fully connected layer和flatten layer,以及每一层所需的w,b。如下图:
有了每一层的参数,可以构建若干conv layer 和 pooling layer。 由于本应用不使用flatten layer 和 fc layer 的输出结果,而且VGG16 大部分的参数集中在fc layer,所以不用构建此二层。
当含有训练好参数的网络构建好后,或者说函数y=f(x)
及所有参数都定义好了。此时当输入f(x)
一个x
,便可以得到一个对应的y
。
本应用需要使用三个一模一样网络y=f(x),一个传入content_img,可以得到f(p)每一层的输出;第二个网络传入style_img,可以得到f(a)的每一层输出;第三个网络传入自变量x,f(x)。x是一个2D向量,其初始值为一个随机初始化的向量。本应用就是使随机化的x通过学习逐渐变成一个混合content_img和style_img的图像。
这个应用实际上也是个学习的过程,此过程需要3个Loss值:Lcontent
,Lstyle
,Ltotal
。其中Lcontent是p传入f在M层的输出与x传入f在同一层的输出做平方差;Lstyle是a传入f在N层的输出的Gram矩阵与x传入同一层的输出的Gram矩阵的平方差;最后得到整个学习过程的Loss函数Ltotal:Ltotal=alpha*Lcontent+beta*Lstyle
。Ltotal是一个以x为参数的函数,通过不断更新x的值来最小化Ltotal。同样是学习过程,不同于CNN应用在分类问题,Loss是以x为学习参数,w和b是定值,每次学习都是更新x。
迭代数学公式
实验通过改变alpha 和 beta的值来改变风格转化的程度。特别的,当alpha!=0,beta=0时,Ltotal只与Lcontent有关,这种情况下,学习过程变成了:x通过学习逐渐变成p(content img);当alpha=0,beta!=0时,x通过学习逐渐变成a(style img)。
有趣的是,要想使x学习成p,需要使用f(p)在浅层的输出值;而要想是x学习成a,需要使用f(a)早深层的输出值。所以最终为了使混合图像的效果好,f(p)使用浅层输出,f(a)使用深层输出。