Bootstrap

地震信号去噪学习(自用)

 DnCNN( feed-forward denoising convolutional neural networks)去噪

 基于图像先验的去噪方法存在

1)测试阶段通常涉及一个复杂的优化问题,使得去噪过程耗时,计算效率不够高2)这些模型存在需要手动设置的参数。

 论文中提出了DnCNN的思路,将残差学习和批处理结合,且在隐藏层内去除潜在的干净图像。 

去噪神经网络的感受野大小决定了能否利用更多的图像上下文信息,其大小与去噪算法中的effective batch(2*d+1)有关。

三种结构,分别如图1三种颜色的框表示,DnCNN有两种特征,采用残差学习网络并采用批处理归一化来加速训练,提高去噪性能。通过与ReLU进行卷积,DnCNN可以通过隐藏层逐步将图像结构从噪声观测中分离出来。

                图1 DnCNN网络架构

补充知识:

  1.  感受野(Receptive Field),在CNN中第n层特征图的一个像素对应于第一层(输入图像)的像素数,为该层的RF。

网络第1层输入,第n层输出。第k层和第k + 1层之间的滤波器,其尺寸为f k,步长为sk。

采用递归的思想求解感受野。

 图2 感受野递归求解原理图

感受野求解公式:

  1.  残差网络

为什么引入残差网络?

由于当网络层数加深,会存在三种问题:

1.计算量增加——可采用GPU辅助计算;

2.过拟合——采集海量数据,并采用Dropout正则化方法;

3.梯度消失/梯度爆炸——Batch normalization;

但在训练网络过程中,网络深度加深可能导致网络退化。高层特征较少,考虑将低层的特征传递给高层——利用直接映射连接不同的网络。

建立残差网络:

残差网络由残差块组成,残差块可以表示为

 图3 残差块结构图

1×1cov用于降维使得浅层网络维度与深层网络相同。

残差块代码如下:

def res_block_v1(x, input_filter, output_filter):
    res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(x)
    res_x = BatchNormalization()(res_x)
    res_x = Activation('relu')(res_x)
    res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x)
    res_x = BatchNormalization()(res_x)
    if input_filter == output_filter:
        identity = x
    else: #需要升维或者降维
        identity = Conv2D(kernel_size=(1,1), filters=output_filter, strides=1, padding='same')(x)
    x = keras.layers.add([identity, res_x])
    output = Activation('relu')(x)
    return output

残差网络建立步骤:

  1. 建立plain_VGG网络
  2. 在Plain VGG的卷积网络之间插入Identity Mapping

应用残差网络的原理:

残差网络不会出现梯度消失或者梯度爆炸,在实验之后可得残差块中的激活函数Relu以图4顺序出现,误差最小,效果最好。

 图4 改进后残差块结构图

改进后代码:

def res_block_v2(x, input_filter, output_filter):
    res_x = BatchNormalization()(x)
    res_x = Activation('relu')(res_x)
    res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x)
    res_x = BatchNormalization()(res_x)
    res_x = Activation('relu')(res_x)
    res_x = Conv2D(kernel_size=(3,3), filters=output_filter, strides=1, padding='same')(res_x)
    if input_filter == output_filter:
        identity = x
    else: #需要升维或者降维
        identity = Conv2D(kernel_size=(1,1), filters=output_filter, strides=1, padding='same')(x)
    output= keras.layers.add([identity, res_x])
    return output

​​​​​​​思考:

感觉DnCNN也是利用到了VGG网络的一个提高,主要储备知识:深度学习相关概念明晰。

经过分析得到每一个模型都有其优劣,所以重要的是选择合适的模型进行去噪,最后选取一个比较好的方案提升去噪效果。

;