思路来源
一开始的ResNet被提出来是为了解决更高层次的计算机视觉问题,如图像分类和检测。但是,根据实验表明,直接对底层视觉问题套用ResNet架构,如超分辨率,得到的答案可能是次优的。
所以,本文作者据此对SRResNet的残差块做出了一定的修改,并取得了性能的飞跃。
修改如下:去除掉了SRResNet的批量标准化(batch normalization, BN)层
原因分析
BN层的作用是对特征进行归一化,可以消除网络特征的范围灵活性。但是,对于SR问题来说,去除特征的范围灵活性会导致本来不多的特征信息再次减少,不利于产生HR
效果
对图像超分辨率来说,网络输出的图像在色彩、对比度、亮度上要求和输入一致,改变的仅仅是分辨率和一些细节。而Batch Norm,对图像来说类似于一种对比度的拉伸,任何图像经过Batch Norm后,其色彩的分布都会被归一化。也就是说,它破坏了图像原本的对比度信息,所以Batch Norm的加入反而影响了网络输出的质量。
(个人的理解,超分辨率CNN输入和输出可以认为有着很相似的空间分布,而BN白化中间的特征的方式完全破坏了原始空间的表征,因此在重建需要模型中部分层或者参数来恢复这种表征)
首先,作者认为提高网络模型性能的最简单方法是增加参数的数量,增加参数的方式主要有以下俩种:
当考虑有限的资源时,增加宽度(特征Channels的数量)F而不是深度(层数)B来最大化模型容量。
但是特征图的数量增加(太多的残差块)到一定水平以上会使训练过程在数值上不稳定。
作者提出残差缩放(residual scaling)来解决这个问题。
残差缩放(residual scaling)即残差块在相加前,经过卷积处理的一路乘以一个小数(作者用了0.1)。
作者实现方式:在每个残差块中,在最后的卷积层之后放置恒定的缩放层。
当使用大量滤波器时,这些模块极大地稳定了训练过程。
在最终单尺度模型EDSR中,通过设置B=32个残差块,F=256个通道,并且在训练x3,x4模型时,采用x2的预训练参数。
在训练EDSR模型的时候,发现如果在训练上采样因子×3和×4的模型时,用预训练的×2网络初始化模型参数,可以加速了训练并提高了最终性能,如下图所示:
首先,预处理模块位于网络的前面,以减少不同尺度的输入图像的差异。每个预处理模块由2个具有5×5内核的残差块组成。通过采用较大的内核进行预处理模块,可以在网络早期覆盖较大的视野域的同时,保持特定于尺度的部分较浅
最终的MDRS模型中B=80和F=64,而且基于共享残差块的设计,在保持网络较深的情况下,没有增加太多倍的参数。
训练时,损失函数用L1而不是L2,即根据LapSRN的思想采用了L1范数来计算对应的误差,L2损失会导致模糊的预测。
原因如下:
更深层的原因是是实际图像可能含有多种特征,对应有关的图像构成的真实分布。
图像特征分布有许多个峰值,比如特征1是一个峰,特征2是一个峰…
对于这种图像分布,我们称之为:多模态(Multimodal)。
假如用MSE(或者L2)作为损失函数,其潜在的假设是我们采集到的样本是都来在同一个高斯分布。
但是生活中的实际图像具有多种特征,而且大部分图像分布都不只有一个峰。
如果强行用一个单峰的高斯分布,去拟合一个多模态的数据分布,例如两个峰值。
因为损失函数需要减小生成分布和数据集经验分布(双峰分布)直接的差距,而生成分布具有两种类型,模型会尽力去“满足”这两个子分布,最后得到的优化结果。(此处分析来自于大神~,我仅仅是个学习者)
简而言之,当我们在使用L2损失训练出来的分布中采样时,虽然采集到的样本属于数据集真实分布的几率很低,但是由于处于中间位置,会被大量采集出来。
故我们最终得到的生成样本实质上是多种特征的数据样本特征信息的平均效果,故产生模糊图像。
也就是生成的图像中的某些信息很可能不属于特征所要表现的任何一个