论文笔记22:QRNN3D: 3D Quasi-Recurrent Neural Network for Hyperspectral Image Denoising

引言

参考:J. Bradbury, S. Merity, C. Xiong, and R. Socher. Quasi-recurrent neural networks. International Conference on Learning Representations (ICLR), 2017.

基于学习的方法依赖于卷积神经网络来代替昂贵的优化和手工制作的先验。尽管结果令人满意,但这些方法通过学习多通道或band-wise 2D卷积来模拟HSI,这牺牲了光谱维的灵活性(因此需要再训练网络来适应光谱维不匹配的HSI),或牺牲了提取GCS(global correlation along spectrum)知识的模型能力(因此导致相对较低的性能)。

在这里插入图片描述

我们引入了一个新的构件,即3D准递归单元(QRU3D),从3D的角度对HSI进行建模。该单元包含一个3D卷积子组件和一个准递归池化函数,分别支持结构空谱相关和GCS建模。3D卷积子组件可以从多个相邻光谱中提取空间光谱特征,而准循环池化在动态门控(gating)机制的控制下,在整个光谱上循环合并这些特征。这种机制使得池化权重可以通过输入特征动态计算,从而允许自适应地建模GCS知识。为了消除由普通递归结构引入的单向(unidirectional)因果依赖,我们进一步提出了一种没有额外计算成本的交替方向结构。

相关工作

HSI去噪的一些方法:BM4D、TDL、低秩张量:ITS-Reg,LLRT和NG-meet.

HSI去噪的DL方法:HSI-DeNet、HSID-CNN、DSSRL等,所有这些基于DL的方法都没有充分利用GCS的知识,并且它们不能调整学习的参数来自适应地拟合输入数据,因此缺乏辨别与输入相关的空谱相关性的自由。

DL去噪:DnCNN、Image restoration using very deep convolutional encoder-decoder networks with symmetric skip connections、MemNet(Memnet: A persistent memory network for image restoration)、Residual dense network for image restoration、Residual non-local attention networks for image restoration. 虽然所有这些网络都可以直接扩展到HSI的情况,但没有一个专门考虑HSI的领域知识(domain knowledge)。

深度图像序列建模:BRCN、ConvLSTM

方法

Y = X + ϵ Y=X+\epsilon Y=X+ϵ Y ∈ R H × W × B Y\in\mathbb{R}^{H\times W\times B} YRH×W×B ϵ \epsilon ϵ为加性随机噪声,包括高斯噪声、稀疏噪声(条纹、死线和脉冲)或它们的混合。
在这里插入图片描述

我们的网络由6对对称的QRU3D组成,分别对编码器和解码器进行卷积和反卷积,总共有十二层。在编码器部分,我们使用stride=2的两层卷积对输入进行下采样,然后在解码器部分使用stride=1/2(步长1/2啥意思?)的两层卷积进行上采样。下采样和上采样操作的好处是,我们可以在相同的计算成本下使用更大的网络,并增加感受野大小以利用更大图像区域中的上下文信息。每一层都包含一个核大小为3×3×3的QRU3D,它被设置为根据经验最大化性能。其中 C o u t C_{out} Cout为output channels. 每层都添加了对称跳跃连接。此外,除顶部和底部(配有双向结构)之外的所有层都配备了交替方向结构,以避免方向偏差(bias)。
在这里插入图片描述

3D Quasi-Recurrent Unit

QRU3D是QRNN3D的基本构件。它由两个子组件组成,即3D卷积和准递归池化。
在这里插入图片描述

参考:3d convolutional neural networks for human action recognition.
Learning spatiotemporal features with 3d convolutional networks.

3D卷积:QRU3D的3D卷积利用分离的滤波器组执行两组3D卷积,产生通过不同激活函数的张量序列 Z = tanh ⁡ ( W z ∗ I ) F = σ ( W f ∗ I ) \begin{array}{l} \mathbf{Z}=\tanh \left(\mathbf{W}_{z} * \mathbf{I}\right) \\ \mathbf{F}=\sigma\left(\mathbf{W}_{f} * \mathbf{I}\right) \end{array} Z=tanh(WzI)F=σ(WfI)

其中 I ∈ R C i n × H × W × B I\in\mathbb{R}^{C_{in}\times H\times W\times B} IRCin×H×W×B为来自上一层的输入特征映射(在第一层,输入 I = Y I=Y I=Y C i n = 1 C_{in}=1 Cin=1), Z ∈ R C o u t × H × W × B Z\in\mathbb{R}^{C_{out}\times H\times W\times B} ZRCout×H×W×B是高维候选张量。 F F F Z Z Z有相同的维度,代表控制动态记忆行为的神经遗忘门 W z W_z Wz W f ∈ R C o u t × C i n × 3 × 3 × 3 W_f\in\mathbb{R}^{C_{out}\times C_{in}\times 3\times 3\times 3} WfRCout×Cin×3×3×3都是3D卷积滤波器组(banks), ∗ * 表示3D卷积, σ σ σ表示sigmoid函数。嵌入式C3D可以有效地利用HSI中的结构空谱相关性。

准递归池化:我们首先沿光谱分裂 Z Z Z F F F,分别生成 z b z_b zb f b f_b fb的序列,然后将这些状态馈入一个准递归池化函数 h b = f b ⊙ h b − 1 + ( 1 − f b ) ⊙ z b , ∀ b ∈ [ 1 , B ] ( 1 ) \mathbf{h}_{b}=\mathbf{f}_{b} \odot \mathbf{h}_{b-1}+\left(1-\mathbf{f}_{b}\right) \odot \mathbf{z}_{b}, \quad \forall b \in[1, B]\quad(1) hb=fbhb1+(1fb)zb,b[1,B](1)

其中 ⊙ \odot 代表逐元素乘法, h b − 1 h_{b-1} hb1是通过所有先前状态合并的隐藏状态,也表示该层输出中的第b-1个波段, h 0 = 0 h_0=0 h0=0,遗忘门 f b f_b fb平衡当前候选 z b z_b zb和先前memory的权重,即隐藏状态 h b − 1 h_{b-1} hb1. 它的值依赖于当前输入 I I I而不是像卷积滤波器一样固定,可以有效地适应输入图像本身,而不仅仅依赖于训练阶段学习的参数。通过这种构造,波段间信息将被准确地合并。同时,由于这种动态池化在整个光谱范围内反复运行,因此可以有效地利用GCS.

交替方向结构

前向QRU3D从第一个 z 1 z_1 z1到最后一个 z B z_B zB依次读取候选张量 z b z_b zb,因此隐藏状态 h b h_b hb仅取决于先前的 z b z_b zb(和它们对应的波段)。这引入了因果依赖,因为隐藏状态的计算流单向传播,如图4(a)所示,这对于HSI是不合理的。这引入了因果依赖,因为隐藏状态的计算流单向传播,如图4(a)所示,这对于HSI是不合理的。在这里插入图片描述
一个典型的解决方案是使用双向结构,其中一层网络包含两个子层,即前向QRU3D和反向QRU3D,如图4(b)所示。前向QRU3D按顺序读取候选张量序列,并计算前向隐藏状态序列。反向的QRU3D以相反的顺序读取序列,导致一系列反向的隐藏状态。这一层的输出是通过逐元素地(elementwise)添加向前和向后隐藏状态来计算的。然而,这种结构使计算负担不可接受,因为内存消耗几乎是原来的两倍。

为了缓解这个问题,我们提出了一个交替方向的结构。具有交替方向结构的QRNN3D改变了每个层中隐藏状态的计算流的方向,如图4(c)所示。这种结构是通过交替堆叠(stacking)前向和反向QRU3D(啥意思?)来构建的,其中前向(或反向)状态被下一层中的反向(或前向)状态合并,使得全局上下文信息可以在整个光谱中传播。与双向结构的典型解决方案相比,我们提出的交替方向结构几乎不增加额外的计算成本,同时保持了从HSI的整个光谱建模依赖性的能力,而不管输出的位置如何。

参考:Neural machine translation by jointly learning to align and translate.
Bidirectional recurrent convolutional networks for multi-frame super-resolution.
Bidirectional recurrent neural networks.

实验

ICVL高光谱数据集,其中在31个光谱波段上以1392×1300的空间分辨率收集了201幅图像。我们使用100幅图像进行训练,5幅图像用于验证,而其他图像用于测试。为了扩大训练集,我们从训练HSIs中裁剪多个重叠的体(volumes),然后将每个体作为一个训练样本。在裁剪过程中,每个体的空间大小为64×64,光谱大小为31,目的是保存完整的HSI光谱。还采用了旋转和缩放等数据增强方案,总共产生大约50k个训练样本。对于测试集,在给定计算成本的情况下,我们将每个图像的主要区域裁剪成512×512×31的大小。

此外,我们还在包括Pavia Centre, Pavia University, Indian Pines and Urban在内的高光谱遥感数据集上对模型的鲁棒性和灵活性进行了评估。Pavia Centre的光谱波段数为102,Pavia University为103。Indian Pines和Urban分别由224个波段的AVRIS传感器和210波段的HYDICE高光谱系统采集。两者均已用于真实的HSI去噪实验。

噪声设置:
在这里插入图片描述

在高斯噪声的情况下,我们比较了几种典型的传统方法,包括基于滤波的方法(BM4D)、字典学习方法(TDL)和基于张量的方法(ITSReg、LLRT)。在复杂噪声情况下,相互竞争的传统方法包括低秩矩阵恢复方法(LRMR、LRTV、NMoG)和低秩张量方法(TDTV)。

对于DL方法,我们将我们的模型与HSID-CNN进行比较。此外,任何用于单个图像去噪的DL方法都可以扩展到HSI去噪的情况(通过修改第一层以适应HSI,即 C i n C_{in} Cin从3改变到31)。为了完整起见,我们还比较了这种最先进的2D DL方法,即MemNet(第一层 C i n = 31 C_{in}=31 Cin=31),这需要固定数量的光谱波段。由于我们的训练设置与其他DL方法不同,我们使用精心设计的训练策略来微调/重新训练他们的预训练模型,以在我们的数据集中实现更好的性能。

我们开发了一个增量(incremental)训练策略来稳定和加速训练,这也避免了网络收敛到一个差的局部最小值。网络是通过最小化预测的高质量HSI和GT之间的均方误差(MSE)来学习的。网络参数如[17]中所述进行初始化,并使用ADAM优化器。

[17] Delving deep into rectifiers: Surpassing human-level performance on imagenet classification.

我们只需分别在高斯和复杂噪声情况下训练两个模型。模型是增量式训练的,重用先前状态(预训练参数),以最大化训练效率。
在这里插入图片描述
评估指标:PSNR、SSIM、SAM.

ICVL数据集实验

高斯噪声情形:在第二阶段(epoch 50)结束时训练的模型用于处理所有不同水平的退化图(corruption)(我们不会训练多个网络分别处理不同的噪声强度。相反,仅使用具有不同噪声强度的训练样本来训练单个网络)。图6显示了噪声水平σ = 50时的去噪结果。定性评估结果列于表3。

复杂噪声情形:在第三阶段(epoch 100)结束时训练的单个模型被用来同时处理Case 1-5,我们的训练集中的每个样本都被一种噪声类型(即Case 1-4)破坏,而在Case 5中,每个测试样本都遭受多种类型的噪声,不包含在训练集中。我们分别在图7和表4中显示了定性和定量的结果。图8显示了这些HSIs中每个波段的PSNR值。

遥感图像实验

在这里插入图片描述

图9提供了直观的比较。这似乎表明来自ICVL数据集的知识是对来自帕维亚中心数据集的知识的补充,因此灵活性带来的迁移学习将带来巨大的性能优势。真实数据实验见图10和图11。

讨论与分析

增量训练的有效性:
在这里插入图片描述
QRNN3D中的成分分析:Ablations结果如表6所示。

网络超参数选择(网络的深度和宽度):见表7.

可视化GCS知识:为了在QRNN3D中可视化捕获的GCS知识,我们首先展开等式(1)得到 h j = ∑ i = 1 j Φ j ( z i ) ∀ i , j ∈ [ 1 , B ] , i ≤ j \mathbf{h}_{j}=\sum_{i=1}^{j} \Phi_{j}\left(\mathbf{z}_{i}\right) \quad \forall i, j \in[1, B], i \leq j hj=i=1jΦj(zi)i,j[1,B],ij

其中 Φ j ( z i ) = f j ⊙ f j − 1 ⋯ ⊙ f i + 1 ⊙ ( 1 − f i ) ⊙ z i \Phi_{j}\left(\mathbf{z}_{i}\right)=\mathbf{f}_{j} \odot \mathbf{f}_{j-1} \cdots \odot \mathbf{f}_{i+1} \odot\left(1-\mathbf{f}_{i}\right) \odot \mathbf{z}_{i} Φj(zi)=fjfj1fi+1(1fi)zi.

我们通过 z i z_i zi h j h_j hj的贡献度来定义 G C S i j GCS_{ij} GCSij
G C S i j = ∥ Φ j ( z i ) / h j ∥ F G C S_{i j}=\left\|\Phi_{j}\left(\mathbf{z}_{i}\right) / \mathbf{h}_{j}\right\|_{F} GCSij=Φj(zi)/hjF

其中 / / /表示element-wise division. 它还暗示了波段 i i i对波段 j j j的影响。为了完全可视化GCS(在前向(反向)的QRU3D中,捕获的GCS是一个上(下)三角形矩阵),我们选择第一个双向QRU3D进行分析。图13(a)展示了一个随机选择的HSI的捕获GCS,显示了每个波段的输出将受到整个光谱的高度影响。图13(b)显示了每个波段输出的相对波段数。可以看出,第15~17波段( h 15 , h 17 h_{15},h_{17} h15,h17)与几乎所有波段( Z Z Z)都有很深的相关性。图13(c)总结了ICVL所有测试图像的统计数据。它表明,随机选择的波段通常与至少15个波段(总共31个)相关,这意味着我们的模型有效地利用了GCS,并且我们的方法还可以自动确定全局光谱中最相关的波段。

在这里插入图片描述
我们在ICVL数据集上预处理的模型可以直接用于处理遥感图像,而这在大多数现有的用于HSI建模的DL方法中是不可行的。

★代码测试

源代码:https://github.com/Vandermode/QRNN3D

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你介绍如何用Python实现QRNNQRNN (Quasi-Recurrent Neural Network) 是一种新型的深度学习模型,能够有效地处理时间序列数据。相比于传统的循环神经网络 (RNN),QRNN 在处理长序列时具有更好的性能和可扩展性。 下面是使用Python实现QRNN的步骤: 1. 首先,导入必要的库,包括Keras、TensorFlow等。 ```python import keras import tensorflow as tf ``` 2. 定义模型的输入和输出。对于QRNN模型,输入通常是一个形状为 `(batch_size, time_steps, input_dim)` 的张量,其中 `batch_size` 表示每个批次的样本数量,`time_steps` 表示时间步数,`input_dim` 表示每个时间步的特征维数。输出通常是一个形状为 `(batch_size, output_dim)` 的张量,其中 `output_dim` 表示输出的维数。 ```python inputs = keras.layers.Input(shape=(time_steps, input_dim)) x = keras.layers.QRNN(units=64, window_size=3, dropout=0.2)(inputs) outputs = keras.layers.Dense(output_dim, activation='softmax')(x) ``` 在这里,我们使用 `keras.layers.QRNN()` 函数来定义一个具有 `64` 个隐藏单元、窗口大小 `3` 和 `dropout` 概率 `0.2` 的QRNN层。 3. 编译模型。在这一步中,我们需要为模型指定优化器、损失函数和评估指标。 ```python model = keras.models.Model(inputs=inputs, outputs=outputs) optimizer = keras.optimizers.Adam(lr=0.001) model.compile(optimizer=optimizer, loss='categorical_crossentropy', metrics=['accuracy']) ``` 在这里,我们使用 `Adam` 优化器,`categorical_crossentropy` 损失函数和 `accuracy` 评估指标。 4. 训练模型。在这一步中,我们需要使用 `model.fit()` 函数来训练模型,并指定训练数据和相关的参数。 ```python history = model.fit(x_train, y_train, batch_size=32, epochs=10, validation_data=(x_val, y_val)) ``` 在这里,我们使用 `x_train` 和 `y_train` 表示训练数据和训练标签,`x_val` 和 `y_val` 表示验证数据和验证标签。我们还指定每个批次的大小为 `32`,训练 `10` 个周期。 5. 评估模型。在这一步中,我们需要使用 `model.evaluate()` 函数来评估模型的性能。 ```python test_loss, test_acc = model.evaluate(x_test, y_test) print('Test loss: %.4f, test accuracy: %.4f' % (test_loss, test_acc)) ``` 在这里,我们使用 `x_test` 和 `y_test` 表示测试数据和测试标签。我们将输出模型的测试损失和测试精度。 以上就是使用Python实现QRNN的全部步骤。希望能对您有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值