接了导师的活,要求把TVloss加入到已经写好的DnCNN里,下面是tvloss代码:

class TVLoss(nn.Module):
    def __init__(self, TVLoss_weight=1):
        super(TVLoss, self).__init__()
        self.TVLoss_weight = TVLoss_weight


    def forward(self, x):
        batch_size = x.size()[0]
        h_x = x.size()[2]
        w_x = x.size()[3]
        count_h = self._tensor_size(x[:, :, 1:, :])  # 算出总共求了多少次差
        count_w = self._tensor_size(x[:, :, :, 1:])
        h_tv = torch.pow((x[:, :, 1:, :] - x[:, :, :h_x - 1, :]), 2).sum()
        # x[:,:,1:,:]-x[:,:,:h_x-1,:]就是对原图进行错位,分成两张像素位置差1的图片,第一张图片
        # 从像素点1开始(原图从0开始),到最后一个像素点,第二张图片从像素点0开始,到倒数第二个
        # 像素点,这样就实现了对原图进行错位,分成两张图的操作,做差之后就是原图中每个像素点与相
        # 邻的下一个像素点的差。
        w_tv = torch.pow((x[:, :, :, 1:] - x[:, :, :, :w_x - 1]), 2).sum()
        return self.TVLoss_weight * 2 * (h_tv / count_h + w_tv / count_w) / batch_size


    def _tensor_size(self, t):
        return t.size()[1] * t.size()[2] * t.size()[3]

可以看出返回的是一个数,使用方法为:

addition = TVLoss() # 初始化
loss = addition(model(batch_y)) # 输入为经过模型得出的fakex
loss = Variable(loss, requires_grad=True)

实验——TV Loss解决over fitting的问题,tvloss在深度学习里不可以单独的作为loss,需要配合其他loss使用,在这里我们引入sum_squared_error 误差平方和:

criterion = sum_squared_error()
loss2 = criterion(model(batch_y), batch_y - batch_x)
loss = (loss * args.tvlosspr) + loss2 # args.tvlosspr为事先定义好的tvloss参数

如上,就把TVloss嵌入进程序里了(好不好用我也不知道)

如果不好用的话我会回来改一下,如果过去一个月了这篇文章还没有改那就证明这个方法成功了(至少没失败)


2021年4月21日更新

发现更为简便的加loss方法


my = model(batch_y)
loss2 = criterion(my, batch_y - batch_x)
tvloss = 1e-6 * (torch.sum(torch.abs(my[:, :, :, :-1] - my[:, :, :, 1:])) + torch.sum(torch.abs(my[:, :, :-1, :] - my[:, :, 1:, :]))) #1e-6为参数
loss =   tvloss + loss2 

这个方法我也没试验过

等有时间再实验吧

EOF