与VQVAE相比,VQGAN的作者首先把里面的重构损失 L r e c L_{rec} Lrec换成感知损失(perceptual loss)
所谓的感知损失,在一般请看下,就是把真实的图像,和解码器复原的图像,一起送给一个神经网络,比如VGG16,把这两张图像经过VGG16,都编码成特征向量,然后计算特征向量的差别,比如
L
p
e
r
=
∣
∣
V
G
G
(
x
)
−
V
G
G
(
x
^
)
∣
∣
2
(2)
L_{per}=||VGG(x)-VGG(\hat x)||_2\tag{2}
Lper=∣∣VGG(x)−VGG(x^)∣∣2(2)
这只是举个例子,在文章中VQGAN的代码中,比这个复杂一点,它是在很多层都进行都去计算式(2)。
另外,值得注意的是,虽然论文里面写的是把重构损失换成感知损失,但是在本文上面的代码中,其实两种损失都用到了。我个人觉得也没什么不妥的,很显然重构损失是在图像层面的差异,而感知损失是特征向量的差异,所以两者加起来应当不会有什么问题。