VDSR神经网络

1 VDSR

VDSR于2016年于Jiwon Kim等人所提出。作者主要使用了一种基于VGG-Net的深度卷积网络,训练时只学习残差,最终得到了极高的学习率(比SRCNN高104倍),并且在图片质量表现上也有很大优势。
正如VDSR论文中所提到的,输入的低分辨率图像和输出的高分辨率图像在很大程度上是相似的,也就是说低分辨率图像携带的低频信息与高分辨率图像的低频信息是相近的,训练时带上这部分就会多花费时间,实际上只需要学习高分辨率图像和低分辨率图像之间的高频残差即可。VDSR是最直接明显的学习残差的结构,其网络结构如下图所示。
在这里插入图片描述
作者认为,增加网络的深度会显著提高性能。
网络模型共有20层,第一层对输入图像进行操作,最后一层用于图像重建。除了第一层和最后一层外,其他卷积层为同一类型: 3 × 3 × 64 3\times3\times64 3×3×64
网络将插值后的低分辨率图像(到所需大小)作为输入,再将这个图像与网络学到的残差相加得到最终的网络的输出。

激活函数:ReLU
损失函数:MSE

在文章中,作者定义残差图像 r = y − x \rm{r}=\rm y -\rm x r=yx x \rm x x 为插值的低分辨率图像, y \rm y y 表示高分辨率图像。想要预测这个残差图像,损失函数则变为 1 2 ∣ ∣ r − f ( x ) ∣ ∣ 2 \frac12 ||\text{r}-f(\rm x)||^2 21rf(x)2

2 CODE

import torch
import torch.nn as nn

class VDSR(nn.Module):
    def __init__(self):
        super(VDSR, self).__init__()
        self.firstPart = nn.Conv2d(1, 64, kernel_size=3, stride=1, padding=1, bias=False)

        self.midPart = [nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1, bias=False),nn.ReLU(inplace=True)]
        for _ in range(17):
            self.midPart.extend([nn.Conv2d(64, 64, kernel_size=3, stride=1, padding=1, bias=False), nn.ReLU(inplace=True)])
        self.midPart = nn.Sequential(*self.midPart)

        self.lastPart = nn.Conv2d(64, 1, kernel_size=3, stride=1, padding=1, bias=False)
        self.relu = nn.ReLU(inplace=True)
        
    def forward(self, x):
        residual = x
        x = self.relu(self.firstPart(x))
        x = self.midPart(x)
        x = self.lastPart(x)
        out = torch.add(x, residual)
        return out


a = torch.rand(5, 1, 250, 250)
model = VDSR()
output = model(a)
print(output.shape)
print(model)

https://zhuanlan.zhihu.com/p/31664818
https://arxiv.org/abs/1511.04587

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值