【每日一题】网络层数越深,梯度弥散现象可能会越严重
、VGG等网络模型,将神经网络的发展带到了几十层的阶段。研究人员发现,网络层越深,越有可能获得更好的泛化能力。但随着模型的深入,网络变得越来越难训练残差网络的核心设计,主要是由于梯度分散现象。在更深的神经网络中间,当梯度信息从网络的最后一层传输到网络的第一层时,在传输过程中梯度会接近于0。网络层越深,梯度分散现象可能越严重。有什么方法可以实现深度残差网络?今天就来分析一下番茄的加速度。
为了解决这个问题,研究人员尝试在深度神经网络中添加一种浅层神经网络的回退机制。当深度神经网络很容易回退到浅层神经网络时,深度神经网络可以实现与浅层神经网络相媲美的模型性能而不会更差。
通过添加直接连接在输入和输出之间的 Skip,可以为神经网络提供回退功能。以VGG13深度神经网络为例,假设在VGG13模型中观察到梯度弥散现象,而10层网络模型没有观察到梯度弥散现象,那么可以考虑在最后两个卷积层中加入Skip . 这样网络模型就可以自动选择是通过两个卷积层完成特征变换,还是跳过两个卷积层选择Skip,或者结合两个卷积层的输出并Skip。
层数回退机制是通过在卷积层的输入和输出之间添加Skip来实现的。输入经过两个卷积层得到特征变换后的输出ℱ(·),将对应的元素加到输入中得到最终的输出:H(x) = x + f(x)
完成
1.定义残差模块
首先新建一个类,在初始化阶段的 block中创建需要的卷积层、激活函数层等,首先新建一个f(·)卷积层:
作为 tf
来自喀拉斯
来自 .keras ,
类(.Layer):
# 残差模块
def (自我, , =1):
超级(,自我)。()
# 第一个卷积单元
self.conv1 = .(, (3, 3), =, ='same')
self.bn1 = .()
self.relu = .('relu')
# 第二个卷积单元
self.conv2 = .(, (3, 3), =1, ='same')
self.bn2 = .()
if != 1:# 通过1x1卷积完成形状匹配
自己。= ()
self..add(.(, (1, 1), =))
else: # 形状匹配,直接连接
自己。= x:x
def call(self, , =None):
# [b, h, w, c],通过第一个卷积单元
out = self.conv1()
out = self.bn1(out)
out = self.relu(out)
# 通过第二个卷积单元
out = self.conv2(out)
out = self.bn2(out)
# 按模块
=自我。()
# 2个路径输出直接相加
= .add([输出, ])
= tf.nn.relu() # 激活函数
2.实现类
类(keras.Model):
# 通用实现类
def (self, , =10): # [2, 2, 2, 2]
超级(,自我)。()
# 根网络,预处理
自己。词干 = ([.(64, (3, 3), =(1, 1)),
.(),
.('relu'),
.(=(2, 2), =(1, 1), ='same')
])
# 堆叠4个block,每个block包含多个,设置步骤不同
自己。=自我。(64,[0])
自己。=自我。(128,[1]残差网络的核心设计,=2)
自己。=自我。(256,[2],=2)
自己。=自我。(512,[3],=2)
# 逐层减小高度和宽度为1x1
自己。= .2D()
# 最后连接一个全连接层分类
self.fc = .Dense()
def call(self, , =None):
# 通过根网络
x = 自我。干()
# 一次通过 4 个模块
x = 自我。(x)
x = 自我。(x)
x = 自我。(x)
x = 自我。(x)
# 通过池化层
x = 自我。(x)
# 通过全连接层
x = self.fc(x)
X
def (自我, , , =1):
# 辅助函数,堆叠
= ()
# 只有第一步可能不是1,实现下采样
。添加((, ))
for _ in range(1, ): #其他步骤为1
.add((, =1))
以上就是实现深度残差网络的原理和方法。欢迎指正。
了解更多学习网络推广知识,就来广西网络推广。
上一篇:一下:传统制造行业为什么要做网络营销推广?(一) 下一篇:深度残差网络的主要分析及操作友情链接 : 版权所有 技术支持:广西曾维沛网络科技