給CNN添加TVloss的隨記


接了導師的活,要求把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嵌入進程序里了(好不好用我也不知道)

如果不好用的話我會回來改一下,如果過去一個月了這篇文章還沒有改那就證明這個方法成功了(至少沒失敗)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM