举个栗子:
使用的网络是vgg19。
个人理解
对于卷积网络而言,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之间的差异:
2、风格损失:
对于风格采用格拉姆矩阵,以feature map之间特征的互相关来作为判断。
还是以内容损失中shape为[1,M1,M2,N]的张量为例,每一个filters,都是对图像风格的一种理解,而这个理解,就储存在M1*M2的向量中。
格拉姆矩阵:
单个feature map的损失:
其中,
最终的风格损失则是多个不同的feature map的损失加权后的和:
我的栗子中风格损失选用了conv1_1、conv2_1、conv3_1、conv4_1、conv5_1五层,内容损失选用了conv4_2。
总损失就是它们的加权和:
之后只需要用梯度下降,经过不断迭代,就可以完成风格迁移了。