1、Gram矩阵的定义
2、意义
格拉姆矩阵可以看做feature之间的偏心协方差矩阵(即没有减去均值的协方差矩阵),在feature map中,每个数字都来自于一个特定滤波器在特定位置的卷积,因此每个数字代表一个特征的强度,而Gram计算的实际上是两两特征之间的相关性,哪两个特征是同时出现的,哪两个是此消彼长的等等,同时,Gram的对角线元素,还体现了每个特征在图像中出现的量,因此,Gram有助于把握整个图像的大体风格。有了表示风格的Gram Matrix,要度量两个图像风格的差异,只需比较他们Gram Matrix的差异即可。
总之, 格拉姆矩阵用于度量各个维度自己的特性以及各个维度之间的关系。内积之后得到的多尺度矩阵中,对角线元素提供了不同特征图各自的信息,其余元素提供了不同特征图之间的相关信息。这样一个矩阵,既能体现出有哪些特征,又能体现出不同特征间的紧密程度。
3、计算实例
MATLAB计算程序及结果:
x1=[3,3]',
x2=[4,3]',
x3=[1,1]',
G=[x1'*x1,x1'*x2,x1'*x3;
x2'*x1,x2'*x2,x2'*x3;
x3'*x1,x3'*x2,x3'*x3]
G =
18 21 6
21 25 7
6 7 2
风格损失函数(Gram矩阵)理解
当我们获取了gram矩阵,实际上就是把握住了这幅作品,不同特征之间的关系与联系,比如哪一种特征的量比较多,哪些特征和出现比较多的这个特征正相关or负相关,从而得出了这个作品的风格, 而进一步通过style图片和generate图片的gram矩阵之间的计算出相应的风格损失函数,就可以比较出两者在风格之间的差异
tensorflow keras 代码表述如下:# 将一个 nD 张量变成一个 第 0 维相同的 2D 张量。换句话说,它将批次中的每一个样本展平。# keras.backend.batch_flatten(x)# 重新排列张量的轴。# keras.backend.permute_dimensions(x, pattern)def gram_matrix(x): features = keras.backend.batch_flatten(K.permute_dimensions(x,(2,0,1))) gram = keras.backend.dot(features,K.transpose(features)) return gram
参考:
https://blog.csdn.net/dcrmg/article/details/81231044
https://blog.csdn.net/tunhuzhuang1836/article/details/78474129
https://blog.csdn.net/Hi_maxin/article/details/84979580