深度学习从入门到精通——感知损失

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)



你可能感兴趣的:(深度学习理论,深度学习,图像分类,深度学习,计算机视觉,机器学习)