风格迁移-风格损失函数(Gram矩阵)理解

吴恩达教授卷积神经网络的课程中,有一部分是关于风格迁移的内容。组合内容图片,风格图片生成新的图片

在这里插入图片描述

主体思路是:

  1. 随机生成一张图片(可以基于原内容图片生成,从而加速训练)
  2. 计算其与内容图片之间的内容损失 J c o n t e n t J_{content} Jcontent
  3. 计算其与风格图片之间的风格损失 J s t y l e J_{style} Jstyle
  4. 最小化损失函数 J = α J c o n t e n t + β J s t y l e J=αJ_{content}+βJ_{style} J=αJcontent+βJstyle(其中α,β为超参数)

对于内容损失函数,比较容易理解。

内容损失函数是比较容易理解的(比较生成的图片与内容图片在预训练好的网络中某一层的特征图的相似度

(计算两个特征图的L2距离))

风格损失函数
  1. 公式

    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]SG[l]GF2/(2nW[l]nH[l]nc[l])=kk(Gkk[l]SGkk[l]G)2/(2nW[l]nH[l]nc[l])

  2. 详解

    在这里插入图片描述

    • 首先我们要知道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 kk 大小的矩阵,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矩阵之间的计算出相应的风格损失函数,就可以比较出两者在风格之间的差异。

  3. 关键点

    理解feature map的含义以及将feature map不同通道之间的关系转换到风格上。

  • 31
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Gram矩阵风格迁移中一个非常重要的概念,用于描述图片的纹理特征。下面是使用Python代码计算Gram矩阵的示例: ``` python import tensorflow as tf import numpy as np import PIL.Image # 加载图片并进行预处理 image_path = 'path/to/image.jpg' image = np.array(PIL.Image.open(image_path)) image = tf.keras.applications.vgg19.preprocess_input(image) # 加载VGG19模型,提取卷积层特征 model = tf.keras.applications.VGG19(include_top=False, weights='imagenet') model.trainable = False outputs = [layer.output for layer in model.layers] feature_extractor = tf.keras.Model(inputs=model.inputs, outputs=outputs) features = feature_extractor(image) # 计算Gram矩阵 def gram_matrix(input_tensor): result = tf.linalg.einsum('bijc,bijd->bcd', input_tensor, input_tensor) input_shape = tf.shape(input_tensor) num_locations = tf.cast(input_shape[1]*input_shape[2], tf.float32) return result/(num_locations) style_features = features[2:] style_gram_matrices = [gram_matrix(feature) for feature in style_features] ``` 在上面的示例代码中,我们首先加载了一张图片,并使用VGG19模型对其进行预处理和特征提取。然后,我们定义了一个函数 `gram_matrix` 来计算输入张量的Gram矩阵。最后,我们计算了图片的卷积层特征,并使用 `gram_matrix` 函数计算了每个特征的Gram矩阵。 需要注意的是,上面的示例代码中使用了TensorFlow 2.x版本的API,如果您使用的是TensorFlow 1.x版本,请将 `tf.linalg.einsum` 改为 `tf.einsum`,并将 `tf.keras.Model` 改为 `tf.compat.v1.keras.Model`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值