接了导师的活,要求把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
I'm so cool. Please give me money.
- 本文链接:https://www.tjzzz.com/posts/7f652458.html
- 版权声明:本博客所有文章除特别声明外,均默认采用 许可协议。