不同loss function之间的对比(基于FSRCNN)

版权声明: https://blog.csdn.net/gwplovekimi/article/details/83994073

对于L2、huber和Cross三种不同的损失函数形式进行测试。(之前都是用L1)

将SR_model.py代码修改如下:

# loss
            loss_type = train_opt['pixel_criterion']
            if loss_type == 'l1':
                self.cri_pix = nn.L1Loss().to(self.device)
            elif loss_type == 'l2':
                self.cri_pix = nn.MSELoss().to(self.device)
            #######################################################################
            elif loss_type=='huber':
                self.cri_pix = nn.SmoothL1Loss().to(self.device)

            elif loss_type=='Cross':
                self.cri_pix = nn.CrossEntropyLoss().to(self.device)

            ####################################################################3###
            else:
                raise NotImplementedError('Loss type [{:s}] is not recognized.'.format(loss_type))

放大两倍

#######################################################################################################3
#FSRCNN
class FSRCNN(nn.Module):
    def __init__(self, in_nc, out_nc, nf, nb, upscale=2, norm_type='batch', act_type='relu', \
            mode='NAC', res_scale=1, upsample_mode='upconv'):##play attention the upscales
        super(FSRCNN,self).__init__()
        #Feature extractionn
        self.conv1=nn.Conv2d(in_channels=in_nc,out_channels=nf,kernel_size=5,stride=1,padding=2)#nf=56.add padding ,make the data alignment
        self.prelu1=nn.PReLU()
 
        #Shrinking
        self.conv2=nn.Conv2d(in_channels=nf,out_channels=12,kernel_size=1,stride=1,padding=0)
        self.prelu2 = nn.PReLU()
 
        # Non-linear Mapping
        self.conv3=nn.Conv2d(in_channels=12,out_channels=12,kernel_size=3,stride=1,padding=1)
        self.prelu3 = nn.PReLU()
        self.conv4=nn.Conv2d(in_channels=12,out_channels=12,kernel_size=3,stride=1,padding=1)
        self.prelu4 = nn.PReLU()
        self.conv5=nn.Conv2d(in_channels=12,out_channels=12,kernel_size=3,stride=1,padding=1)
        self.prelu5 = nn.PReLU()
        self.conv6=nn.Conv2d(in_channels=12,out_channels=12,kernel_size=3,stride=1,padding=1)
        self.prelu6 = nn.PReLU()
 
        # Expanding
        self.conv7=nn.Conv2d(in_channels=12,out_channels=nf,kernel_size=1,stride=1,padding=0)
        self.prelu7 = nn.PReLU()
 
        # Deconvolution
        self.last_part= nn.ConvTranspose2d(in_channels=nf,out_channels=in_nc,kernel_size=9,stride=upscale, padding=4, output_padding=1)
 
 
    def forward(self, x):#
         out = self.prelu1(self.conv1(x))
         out = self.prelu2(self.conv2(out))
         out = self.prelu3(self.conv3(out))
         out = self.prelu4(self.conv4(out))
         out = self.prelu5(self.conv5(out))
         out = self.prelu6(self.conv6(out))
         out = self.prelu7(self.conv7(out))
         out = self.last_part(out)
 
         return out
 
 
##########################################################################################################

结果对比如下:

在初始的时候,huber function的效果比L2的要好,或者说比L2的PSNR上升得更快。baseline中采用得为L1,那么上升得效果也是较差得~

结果如下图所示

cross function会报错。。。。

由此看来,如果采用cross需要改比较多的数据结构。。。为此这里就不展开了。。。。

一个不错得pytorch手册

http://www.ituring.com.cn/book/2456

猜你喜欢

转载自blog.csdn.net/gwplovekimi/article/details/83994073
今日推荐