残差网络RseNet

2021-09-24  本文已影响0人  斐硕人

残差网络解决了什么问题

残差网络 是为了解决深度神经网络(DNN)隐藏层过多时的网络退化问题而提出。退化(degradation)问题是指:当网络隐藏层变多时,网络的准确度达到饱和然后急剧退化,而且这个退化不是由于过拟合引起的。
假设在浅层网络上叠加与其相同,称之为恒等映射的层,那么即使网络深度增加,其训练误差应该不高于原来的浅层网络。因为直接让一些叠加层去拟合一个潜在的恒等映射函数 H (x) = x 会比较困难,所以采用一些非线性层,让它们去拟合另一种残差映射 F (x) := H (x)-x ,而原来的映射则变成 H (x) = F (x) + x。
Resnet 学习的是残差函数 F (x) = H (x) - x,优化这种残差映射要比优化原始的映射容易

直观理解
直观理解
如图,左边来了一辆装满了“梯度”商品的货车,来领商品的客人一般都要排队一个个拿才可以,如果排队的人太多,后面的人就没有了。于是这时候派了一个人走了“快捷通道”,到货车上领了一部分“梯度”,直接送给后面的人,这样后面排队的客人就能拿到更多的“梯度”。详细请看参考文章 3

残差网络定义

残差网络 是由一系列 残差块 组成的。
一个残差块可以用表示为:

残差块公式

残差块分成两部分 直接映射部分 h(x1)残差部分 F(x1,W)

残差块图示
图1中的 Weight 在卷积网络中是指卷积操作,addition 是指单位加操作。

在统计学中,残差和误差是非常容易混淆的两个概念。误差是衡量观测值和真实值之间的差距,残差是指预测值和观测值之间的差距。对于残差网络的命名原因,作者给出的解释是,网络的一层通常可以看做 y = H(x) , 而残差网络的一个残差块可以表示为 H(x) = F(x) + x ,也就是 F(x) = H(x) - x ,在单位映射中, y = x 便是观测值,而 H(x) 是预测值,所以 F(x) 便对应着残差,因此叫做残差网络

残差块通用表示形式
h(·) 是直接映射,f(·) 是激活函数,一般使用 ReLU
h(·)f(·) 都是直接映射时,通用残差块转化为:
残差块公式
残差块的实现
1*1残差块
# 1*1残差块
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. 详解残差网络
  2. 深度学习之16——残差网络(ResNet)
  3. 为什么ResNet和DenseNet可以这么深?一文详解残差块为何有助于解决梯度弥散问题。
上一篇下一篇

猜你喜欢

热点阅读