吴恩达教授卷积神经网络的课程中,有一部分是关于风格迁移的内容。组合内容图片,风格图片生成新的图片
主体思路是:
- 随机生成一张图片(可以基于原内容图片生成,从而加速训练)
- 计算其与内容图片之间的内容损失 J c o n t e n t J_{content} Jcontent
- 计算其与风格图片之间的风格损失 J s t y l e J_{style} Jstyle
- 最小化损失函数 J = α J c o n t e n t + β J s t y l e J=αJ_{content}+βJ_{style} J=αJcontent+βJstyle(其中α,β为超参数)
对于内容损失函数,比较容易理解。
内容损失函数是比较容易理解的(比较生成的图片与内容图片在预训练好的网络中某一层的特征图的相似度
(计算两个特征图的L2距离))
风格损失函数
-
公式
a i j k [ l ] S a_{ijk}^{[l]S} aijk[l]S是风格图片在CNN第 l l l层第 ( i , j , k ) (i,j,k) (i,j,k)位置的输出,其中 ( i , j , k ) (i,j,k) (i,j,k)对应高,宽,通道
G k k ′ [ l ] S = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i j k [ l ] S a i j k ′ [ l ] S G_{kk'}^{[l]S}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a_{ijk}^{[l]S}a_{ijk'}^{[l]S} Gkk′[l]S=∑i=1nH[l]∑j=1nW[l]aijk[l]Saijk′[l]S
G k k ′ [ l ] G = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i j k [ l ] G a i j k ′ [ l ] G G_{kk'}^{[l]G}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a_{ijk}^{[l]G}a_{ijk'}^{[l]G} Gkk′[l]G=∑i=1nH[l]∑j=1nW[l]aijk[l]Gaijk′[l]G
J s t y l e ( S , G ) = ∣ ∣ G [ l ] S − G [ l ] G ∣ ∣ F 2 / ( 2 n W [ l ] n H [ l ] n c [ l ] ) = ∑ k ∑ k ′ ( G k k ′ [ l ] S − G k k ′ [ l ] G ) 2 / ( 2 n W [ l ] n H [ l ] n c [ l ] ) J_{style}(S,G)=||G^{[l]S}-G^{[l]G}||_{F}^{2}/(2n_{W}^{[l]}n_{H}^{[l]}n_{c}^{[l]})=\sum_k\sum_{k'}(G_{kk'}^{[l]S}-G_{kk'}^{[l]G})^2/(2n_{W}^{[l]}n_{H}^{[l]}n_{c}^{[l]}) Jstyle(S,G)=∣∣G[l]S−G[l]G∣∣F2/(2nW[l]nH[l]nc[l])=∑k∑k′(Gkk′[l]S−Gkk′[l]G)2/(2nW[l]nH[l]nc[l])
-
详解
-
首先我们要知道CNN中第l层的每一个通道以及每一个通道中的值( a i j k [ l ] a_{ijk}^{[l]} aijk[l])代表什么
在feature map中,每个数字都来自于一个特定滤波器在特定位置的卷积,因此每个数字代表一个特征的强度(https://blog.csdn.net/wangyang20170901/article/details/79037867)
-
对于 G k k ′ [ l ] = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i j k [ l ] a i j k ′ [ l ] G_{kk'}^{[l]}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a_{ijk}^{[l]}a_{ijk'}^{[l]} Gkk′[l]=∑i=1nH[l]∑j=1nW[l]aijk[l]aijk′[l],中的 G G G被称为 g r a m gram gram矩阵
G G G是一个 k ∗ k k*k k∗k 大小的矩阵,k为通道数。
G k k ′ [ l ] = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i j k [ l ] a i j k ′ [ l ] G_{kk'}^{[l]}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a_{ijk}^{[l]}a_{ijk'}^{[l]} Gkk′[l]=∑i=1nH[l]∑j=1nW[l]aijk[l]aijk′[l]
G k k ′ G_{kk'} Gkk′则是gram矩阵中(k,k’)位置的值,由累加第k与第k‘个通道的相应位置的值的乘积得到
gram矩阵可以看做feature之间的偏心协方差矩阵(即没有减去均值的协方差矩阵),Gram计算的实际上是两两特征之间的相关性,哪两个特征是同时出现的,哪两个是此消彼长的等等,同时,Gram的对角线元素,还体现了每个特征在图像中出现的量(https://blog.csdn.net/wangyang20170901/article/details/79037867)
-
当我们获取了gram矩阵,实际上就是把握住了这幅作品,不同特征之间的关系与联系,比如哪一种特征的量比较多,哪些特征和出现比较多的这个特征正相关or负相关,从而得出了这个作品的风格, 而进一步通过style图片和generate图片的gram矩阵之间的计算出相应的风格损失函数,就可以比较出两者在风格之间的差异。
-
-
关键点
理解feature map的含义以及将feature map不同通道之间的关系转换到风格上。