Perceptual Losses

  • ​​感知损失​​

感知损失

图像转换问题(image transformation tasks),输入一副图像转换成另一幅图像输出。现有方法来解决的图像转换问题,往往以监督训练的方式,训练一个前向传播的网络,利用的就是图像像素级之间的误差。这种方法在测试的时候非常有效,因为仅仅需要一次前向传播即可。但是,像素级的误差没有捕获输出和ground-truth图像之间的感知区别(perceptual differences)。

高质量的图像可以通过定义和优化perceptual loss函数来生成,该损失函数基于使用预训练好的网络提供的高层的特征。

观点:不仅仅在输入输出风格相似,在特征上面也应该具有相似性。

  • 获取Vgg三层感知特征
import torch
from torchvision import models
from torch import nn

class Vgg19(nn.Module):
def __init__(self,requires_grad=False):
super(Vgg19, self).__init__()
self.vgg = models.vgg19(pretrained=True).features
self.slice1 = nn.Sequential()
self.slice2 = nn.Sequential()
self.slice3 = nn.Sequential()

for x in range(7):
self.slice1.add_module(str(x),self.vgg[x])
for x in range(7,21):
self.slice2.add_module(str(x),self.vgg[x])
for x in range(21,30):
self.slice3.add_module(str(x),self.vgg[x])
if not requires_grad:
for param in self.parameters():
param.requires_grad = False

def forward(self,x):
h_relu1 = self.slice1(x)
h_relu2 = self.slice2(h_relu1)
h_relu3 = self.slice3(h_relu2)


return [h_relu1,h_relu2,h_relu3]

if __name__ == '__main__':
model = Vgg19()
x = torch.randn(1,3,224,224)
y1,y2,y3 = model(x)
print(y1.shape)
print(y2.shape)
print(y3.shape)