VDSR神经网络

1 VDSR

VDSR于2016年于Jiwon Kim等人所提出。作者主要使用了一种基于VGG-Net的深度卷积网络,训练时只学习残差,最终得到了极高的学习率(比SRCNN高104倍),并且在图片质量表现上也有很大优势。
正如VDSR论文中所提到的,输入的低分辨率图像和输出的高分辨率图像在很大程度上是相似的,也就是说低分辨率图像携带的低频信息与高分辨率图像的低频信息是相近的,训练时带上这部分就会多花费时间,实际上只需要学习高分辨率图像和低分辨率图像之间的高频残差即可。VDSR是最直接明显的学习残差的结构,其网络结构如下图所示。
VDSR神经网络_第1张图片
作者认为,增加网络的深度会显著提高性能。
网络模型共有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

你可能感兴趣的:(图像处理,神经网络,深度学习,神经网络,深度学习,计算机视觉)