Advertisement

Efficient Frequency Domain-based Transformersfor High-Quality Image Deblurring

阅读量:

高质量图像去模糊的高效频域变压器

摘要:

我们提出了一种有效的方法,探索变压器在频域的特性,用于高质量的图像去模糊。我们的方法是由卷积定理驱动的,即两个信号在空间域中的相关或卷积相当于它们在频域中的元素积

这启发我们开发一种有效的基于频域的自注意求解器(FSAS) ,通过元素积运算来估计缩放后的点积注意,而不是在空间域中的矩阵乘法。此外,我们注意到,在transformer中简单地使用朴素前馈网络(FFN)并不能产生良好的去模糊结果。为了克服这个问题,我们提出了一种简单而有效的基于鉴别频域的FFN (DFFN),其中我们在FFN中引入了一种基于联合摄影专家组(JPEG)压缩算法的门控机制,以判别应该保留哪些低频和高频特征信息以进行潜在的清晰图像恢复。我们将提出的FSAS和DFFN形成一个基于编码器和解码器架构的不对称网络 ,其中FSAS仅用于解码器模块以更好地去除图像模糊。实验结果表明,该方法优于现有的方法。

介绍:

我们开发了一个有效的基于频域的自注意求解器来估计尺度点积注意。我们的分析表明,使用基于频域的求解器降低了空间和时间复杂度,并且更加有效和高效。

•我们提出了一种简单而有效的基于JPEG压缩算法的鉴别频域FFN,以鉴别地确定应该保留哪些低频和高频信息以进行潜在的清晰图像恢复。

•我们开发了一种基于编码器和解码器网络的非对称网络架构,其中基于频域的自关注求解器仅用于解码器模块,以更好地消除图像模糊。

•我们分析了变压器在频域的探索特性能够促进模糊去除,并表明我们的方法优于最先进的方法。

Related Work

基于cnn的深度图像去模糊方法。近年来,由于不同深度CNN模型的发展,我们在图像去模糊方面取得了重大进展[3,4,9,16,22,31,32]。在[16]中,Nah等人提出了一种基于多尺度框架的深度CNN,直接从模糊图像中估计清晰图像。为了更好地利用多尺度框架中各个尺度的信息,Tao等[22]开发了一种有效的尺度循环网络。Gao等[9]提出了一种选择性网络参数共享方法来改进[16,22]。

由于使用更多的尺度并不能显著提高性能,Zhang等[32]开发了一种基于多补丁策略的有效网络。去模糊处理是逐步实现的。为了更好地挖掘不同阶段的特征,Zamir等[31]提出了一种跨阶段的特征融合,以获得更好的性能。为了降低基于多尺度框架的方法的计算成本,Cho等[4]提出了一种多输入多输出网络。Chen等[3]对基线模块进行分析,并对其进行简化,以更好地恢复图像。如文献[30]所示,卷积操作是空间不变的,不能有效地模拟图像去模糊的全局环境。

变形金刚及其在图像去模糊中的应用。由于Transformer[25]可以对全局上下文进行建模,并在许多高级视觉任务(如图像分类[14]、目标检测[1,34]和语义分割[28,35])中取得了重大进展,因此它已被开发用于解决图像超分辨率[13]、图像去模糊[24,30]和图像去噪[2,27]。为了降低Transformer的计算成本,Zamir等[30]通过计算缩放后的点积注意力,提出了一种高效的Transformer模型

在特征深度域中。该方法可以沿通道维度有效地挖掘不同特征的信息。然而,对图像恢复至关重要的空间信息并没有得到充分的探索。Tsai等[24]通过构造条内和条间令牌来代替全局关注,简化了自关注的计算。Wang等人[27]提出了一种基于UNet的Transformer,它使用基于非重叠窗口的自关注进行单幅图像去模糊。虽然使用分割策略减少了计算成本,但粗分割不能充分挖掘每个patch的信息。此外,这些方法中的尺度点积注意通常需要复杂的矩阵乘法,其空间和时间复杂度均为二次。

与这些方法不同,我们开发了一种有效的基于变压器的方法,该方法探索了频域的性质,避免了对缩放点积的复杂矩阵乘法的关注。

方法:

我们的目标是提出一种有效的方法来探索变压器的特性,以实现高质量的图像去模糊。为此,我们首先开发了一个有效的基于频域的自注意力求解器来估计缩放后的点积注意力。为了完善基于频域求解器估计的特征,我们进一步开发了基于判别频域的前馈网络。我们将上述方法制定为基于编码器和解码器架构的端到端可训练网络,以解决图像去模糊问题,其中解码器模块中使用基于频域的自关注解算器来估计缩放的点积注意力,以获得更好的特征表示。图2(a)显示了所建议方法的概述。在下文中,我们将介绍每个组件的详细信息。

  1. 频域自注意力求解器(FSAS)
    • 原理 :FSAS通过频域中的逐元素乘积运算来估计缩放点积注意力,从而降低了空间和时间复杂度。
    • 优势 :与空间域中的矩阵乘法相比,FSAS的计算效率更高,且能够更好地处理高分辨率图像。

  • 在频域中,将两个函数的傅里叶变换结果对应位置的元素相乘。这个操作是逐点进行的,即频域中每一个频率点上的值都进行相乘。

JPEG 是一种有损压缩算法,但它在大多数情况下能在保持较高图像质量的同时显著减少文件大小。

关于这个量化矩阵是受启发于jpeg压缩算法,不同的是我们并不能像jpeg压缩那样设计一个手工的矩阵来适应deblur任务,因此我们采用了学习的策略让网络在训练过程中来学习一个适合的系数。

原文中:然而,如何有效地确定哪些频率信息很重要。在JPEG压缩算法的激励下,我们引入了一个可学习的量化矩阵W,并通过JPEG压缩的逆方法来学习它,以确定应该保留哪些频率信息。

(在Transformer模型的量化过程中,量化矩阵W可能用于将模型的权重、激活或嵌入表示映射到更小的数值范围。这种量化可以是静态的(在训练后执行)或动态的(在推理时根据输入进行调整)。量化矩阵W的设计通常旨在最小化量化误差,同时保持模型的性能。)


FFN 用于通过缩放点积注意力来改进特征。由于并非所有低频信息和高频信息都有助于潜在的清晰图像恢复,因此我们开发了一种DFFN,可以自适应地确定应保留哪些频率信息。

非对称网络架构:

我们注意到编码器模块提取的特征是浅层特征,与解码器模块提取的深层特征相比,浅层特征通常包含模糊效果。然而,模糊通常会改变两个相似斑块与清晰特征之间的相似性。因此,在编码器模块中使用FSAS可能无法正确估计相似度,从而影响图像恢复。为了克服这个问题,我们将FSAS嵌入到解码器模块中,这导致了一个更好的图像去模糊的非对称架构。图2(a)显示了所提出的非对称编码器-解码器网络的网络架构。

蓝色框表示不太理解

参数设置。我们使用与[4]相同的损失函数来约束网络,并使用Adam[10]优化器使用默认参数对其进行训练。学习率的初始值为10−3,经过60万次迭代后使用余弦退火策略进行更新。学习速率的最小值为10−7。经验设置补丁大小为256 × 256像素,批量大小设置为16。在训练过程中,我们采用了与[30]相同的数据增强方法。基于JPEG压缩方法,量化矩阵估计的patch大小经验设置为8 × 8。在实现中,量化矩阵的张量形式设置为 [batch_sze; channel_num; 8; 8],其中batch_size和channel_num分别为批数和特征数。在训练过程中通过求解损失函数,与其他参数共同学习量化矩阵。相似度,我们在计算自关注时也使用了8×8像素的patch大小(4)。由于篇幅限制,我们在补充材料中加入了更多的实验结果。

另:

浅层特征:浅层网络提取的特征和输入比较近,蕴含更多的像素点的信息,主要为一些细粒度的信息,比如颜色、纹理、边缘、棱角信息。

原理:浅层网络感受野较小,感受野重叠区域也较小,所以保证网络捕获更多细节

深层特征:深层网络提取的特征离输出较近,蕴含更抽象的信息,即语义信息,主要为一些粗粒度的信息。

原理:感受野增加,感受野之间重叠区域增加,图像信息进行压缩,获取的是图像整体性的一些信息。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:

2. 学习率(Learning rate)的本质及其作用
2.1 学习率的本质1:平衡了两个因素
学习率的本质在于平衡了两个因素之间的关系:
(1)收敛速度:较大的学习率可以使得模型更快地收敛到局部最优解。因为参数更新的步长较大,模型在参数空间中的移动速度更快。——步长大,所以移动块,收敛速度就快。
(2)稳定性:较小的学习率可以使得模型更加稳定,减小了参数更新的幅度,有助于避免参数在训练过程中波动较大,降低了过拟合的风险。——步长小,移动慢且稳,当然收敛速度就慢。

总的来说,针对不同的任务与目的,需要我们选择合适的学习率帮助我们控制参数的更新步幅,进而帮助我们收敛。帮助我们收敛什么呢?在本质2中就知道了!

另外说一下,在上述稳定性因素中最后一句我们提到较小的学习率降低了过拟合的风险,为此我又专门去了解了一下这一点。事实上,较小的学习率在一定程度上的确可以降低过拟合的风险,但并不是主要的过拟合缓解方法。那过拟合又是什么呢?过拟合是指模型在训练数据上表现良好,但在测试数据上表现较差的情况,其主要原因是模型过度拟合了训练数据的噪声和特异性(以至于在测试时,稍微与训练数据的“特异性”不同,模型就认为它不是我们寻求的目标,让模型失去了泛化能力)。那么较小的学习率对降低过拟合的风险的贡献主要体现在以下几个方面:

1)减缓模型训练的速度:较小的学习率会导致模型参数更新的步长较小,使得模型在训练数据上的拟合速度变慢。但是这种减缓的训练速度有助于模型更多地考虑每个样本的特征,进而减少过拟合的可能性。

2)更加平缓的损失曲线:较小的学习率通常会导致训练过程中的损失曲线更加平缓,参数更新更加稳定。这有助于模型更好地探索参数空间,避免了因为学习率过大导致的参数震荡或者错过局部最优解的情况。

虽然较小的学习率可以在一定程度上降低过拟合的风险,但并不是唯一的过拟合缓解方法,也不是最有效的方法。通常来说,缓解过拟合还需要结合其他方法,比如正则化、数据增强、早停策略等(后续再努力学习这些知识点吧),需要把这些方法结合起来才能够更有效地降低过拟合的风险,提高模型的泛化能力。

上面两张明显的对比图就给出了学习率过大和过小的情况:
(1)学习率设置过小的时候,每步太小,下降速度太慢,可能要花很长的时间才会找到最小值。
(2)学习率设置过大的时候,每步太大,虽然收敛得速度很快,但可能会像图中一样,跨过或忽略了最小值,导致一直来回震荡而无法收敛。

总之,学习率的本质就是控制模型参数在每次迭代中更新的步长大小。在深度学习中,模型的目标是通过调整参数来最小化损失函数(也就是差值最小,越来越接近真实值),以便更好地拟合训练数据,并且能够让模型泛化到新数据。学习率决定了参数更新的速度和方向,所以它的选择对模型的训练过程和性能有着重要影响。

在我看来,学习率实际上是一种权衡,需要根据具体的任务和模型来选择合适的大小。过大的学习率可能导致模型无法收敛或者在最优解附近震荡,而过小的学习率可能导致训练速度过慢或者陷入局部最优解。选择合适的学习率是深度学习中重要的调参过程之一。

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:

————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:

  1. 选择初始学习率 :通常从 0.1、0.01 或 0.001 开始。
  2. 选择学习率调整策略 :根据模型、数据集和计算资源选择合适的学习率衰减或自适应学习率优化器。
  3. 监控模型性能 :使用验证集监控模型性能,及时调整学习率。
  4. 实验和调参 :不同任务和模型对学习率的需求不同,可能需要多次实验找到最佳设置。

合适的学习率设置能有效提高模型训练效率和性能,需要结合具体问题和资源进行调试和优化。

Cosine Annealing策略通过余弦函数调整学习率,使得学习率在训练过程中逐渐减小,有助于模型在训练初期快速收敛,训练后期精细调整。带热重启的余弦退火策略进一步通过周期性的重启学习率,帮助模型跳出局部最优解。PyTorch提供了方便的接口来实现这些学习率调整策略。

Cosine Annealing是一种学习率调整策略,通过余弦函数的方式逐渐减小学习率,使得学习率在训练过程中呈现余弦曲线变化。该策略使得学习率在训练开始时较大,并在接近训练结束时逐渐减小到一个较低的值。这样可以在训练初期快速收敛,而在训练后期细致调整模型参数,有助于找到更好的全局最优解。

SGD,全称为随机梯度下降(Stochastic Gradient Descent),是一种优化算法,用于训练机器学习模型,尤其是深度学习模型。它是梯度下降(Gradient Descent)的变种,旨在通过逐步调整模型参数以最小化损失函数,从而找到模型的最佳参数。

定义模型 :在示例代码中,我们定义了一个简单的线性模型 SimpleNet,只有一个全连接层(fc)。

定义损失函数 :使用 nn.MSELoss() 定义均方误差损失函数,适用于回归任务。

定义优化器 :使用 optim.SGD 初始化随机梯度下降优化器,并设置学习率为0.01。

前向传播 :将输入数据 inputs 传递给模型 model,得到预测输出 outputs

计算损失 :使用损失函数 criterion 计算预测输出 outputs 和真实目标 targets 之间的损失值 loss

反向传播和优化

复制代码
 * `optimizer.zero_grad()`:清空之前计算的梯度,防止梯度累积。
 * `loss.backward()`:通过反向传播计算每个参数的梯度。
 * `optimizer.step()`:根据计算的梯度更新模型参数。

循环迭代 :上述步骤在每个epoch内重复执行,直到训练结束。在每个epoch结束时打印当前的损失值,帮助监控训练过程。

(1)batchsize:批大小。在深度学习中,一般采用SGD训练,即每次训练在训练集中取batchsize个样本训练;
(2)iteration:1个iteration等于使用batchsize个样本训练一次;
(3)epoch:1个epoch等于使用训练集中的全部样本训练一次;

举个例子,训练集有1000个样本,batchsize=10,那么:
训练完整个样本集需要:
100次iteration,1次epoch。

通过这些步骤,模型会逐渐调整参数,以最小化损失函数,最终学习到数据中的模式或关系。

全部评论 (0)

还没有任何评论哟~