风格迁移

举个栗子:

风格迁移_第1张图片     风格迁移_第2张图片   风格迁移_第3张图片

使用的网络是vgg19。

风格迁移_第4张图片

个人理解

对于卷积网络而言,cnn拥有抽象和理解图片的能力。

底层的网络记录图像的纹理,高层的网络记录图像的内容,当一张图像输入到网络中后,就会将这些信息储存在feature map中。

而风格迁移,可以认为是将图a中的内容用图b的风格给画出来。

损失定义:

对于生成图片,我们希望在内容上与图a相似,风格上与图b相似,因此,我们定义了两个损失:

1、内容损失:

图像的内容储存在feature map中,feature map则是一个shape为[1,M1,M2,N]的张量,其中N则该层中filters的个数M1,M2可以看作是特征。

内容损失就可以定义输出feature map和当前feature map之间的差异:

L _ { c o n t e n t } ( \vec { p } , \vec { x } , l ) = \frac { 1 } { 2 } \sum _ { i j } \left( F _ { i j } ^ { l } - P _ { i j } ^ { l } \right) ^ { 2 }

2、风格损失:

对于风格采用格拉姆矩阵,以feature map之间特征的互相关来作为判断。

还是以内容损失中shape为[1,M1,M2,N]的张量为例,每一个filters,都是对图像风格的一种理解,而这个理解,就储存在M1*M2的向量中。

格拉姆矩阵:

G _ { i j } ^ { l } = \sum _ { k } F _ { i k } ^ { l } F _ { j k } ^ { l }

单个feature map的损失:

E _ { l } = \frac { 1 } { 4 N _ { l } ^ { 2 } M _ { l } ^ { 2 } } \sum _ { i , j } \left( G _ { i j } ^ { l } - A _ { i j } ^ { l } \right) ^ { 2 }

其中M_l=M1*M2N_l=N

最终的风格损失则是多个不同的feature map的损失加权后的和:

L _ { s t y l e } ( \vec { a } , \vec { x } ) = \sum _ { l = 0 } ^ { L } \omega _ { l } E _ { l }

我的栗子中风格损失选用了conv1_1、conv2_1、conv3_1、conv4_1、conv5_1五层,内容损失选用了conv4_2。

总损失就是它们的加权和:

L _ { t o t a l } ( \vec { p } , \vec { a } , \vec { x } ) = \alpha L _ { c o n t e n t } ( \vec { p } , \vec { x } ) + \beta L _ { s t y l e } ( \vec { a } , \vec { x } )

之后只需要用梯度下降,经过不断迭代,就可以完成风格迁移了。

 

 

 

 

你可能感兴趣的:(深度学习,tensorflow)