残差网络解决了什么问题
残差网络 是为了解决
深度神经网络(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中是左边的直线;
- 残差部分,一般由两个或者三个卷积操作构成,即图1中右侧包含卷积的部分。
图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
参考文章
网友评论