接了導師的活,要求把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嵌入進程序里了(好不好用我也不知道)
如果不好用的話我會回來改一下,如果過去一個月了這篇文章還沒有改那就證明這個方法成功了(至少沒失敗)