计算机系统应用教程网站

网站首页 > 技术文章 正文

从头开始实施ResNet模型 resnet谁提出的

btikc 2024-10-18 04:42:47 技术文章 15 ℃ 0 评论

在我正在研究的深度学习项目中实施ResNet架构时,它是我习惯的基本的,简单的卷积神经网络的巨大飞跃。

ResNet的一个突出特点是它在其更大的宏体系结构中使用了微架构 残留块

我决定亲自调查模型,以便更好地理解它,并研究为什么它在ILSVRC如此成功。我通过Adrian Rosebrock博士[1] 在Python 的计算机视觉深度学习中实现了完全相同的ResNet模型类,该模型遵循了来自2015年ResNet学术出版物,He等人的深度残留学习图像识别的ResNet模型。[2]。

RESNET

当ResNet首次引入时,对于当时深度神经网络的一个巨大问题的证明是一个新的解决方案是革命性的:消失的梯度问题。虽然神经网络是通用函数逼近器,但在某个阈值处添加更多层会使训练变得更慢并使准确度饱和。

资料来源:https://towardsdatascience.com/an-overview-of-resnet-and-its-variants-5281e2f56035

这是由于梯度从最终层到最早层的反向传播 - 将0到1之间的数字相乘多次使其变得越来越小:因此当到达较早的层时,梯度开始“消失”。这意味着较早的层不仅训练较慢,而且更容易出错。这是一个巨大的问题,因为最早的层是整个网络的构建块 - 它们负责识别基本的核心功能!

为了缓解这个问题,ResNet采用了身份快捷方式连接,基本上可以跳过一个或多个层的训练 - 创建一个残留块

单个残余块; He等人提出的原始文件。资料来源:[1]

然后,作者提出了一个“优化的”剩余块,添加了一个称为瓶颈的扩展它会降低前两个CONV层的维数(在最终CONV层中学习的滤波器的1/4),然后在最终的CONV层期间再次增加。这里有两个堆叠在一起的残余模块。

资料来源:使用Python深入学习计算机视觉:从业者捆绑[1]

最后,何等人。发表了关于残余模块的第二篇论文,称为深度剩余网络中的身份映射,它提供了更好的残差块版本:预激活残差模型。这允许渐变通过快捷方式连接传播到任何较早的层而不受阻碍。

我们不是从卷积(权重)开始,而是从一系列(BN => RELU => CONV)* N层开始(假设正在使用瓶颈)。然后,剩余模块输出被馈送到网络中的下一个残余模块的加法运算 (因为残余模块彼此堆叠)。

(a)原始瓶颈残留模块。(e)完整的预激活残留模块。称为预激活,因为BN和ReLU层出现在卷积之前。资料来源:[2]

整个网络架构看起来像这样,我们的模型将类似于它。

资料来源:[2]

让我们开始用Python编写实际网络。这个具体的实施灵感来自He等人。他们的Caffe分布和来自Wei Wu的mxnet实现。

我们将把它写成一个类(ResNet),以便我们稍后在训练深度学习模型时调用它。

我们从标准的CNN导入开始,然后开始构建residual_module函数。看看参数:

  • data:输入到残余模块
  • K:最终CONV层将学习的滤波器数量(前两个CONV层将学习K / 4滤波器)
  • 步幅:控制卷积的步幅(将帮助我们减少空间维度而不使用最大池)
  • chanDim:定义将执行批量标准化的轴
  • 红色(即减少)将控制我们是否正在减小空间尺寸(真实)或不减小(假),因为并非所有残余模块都会减小我们空间体积的尺寸
  • reg:对残差模块中的所有CONV层应用正则化强度
  • bnEps:控制?负责在规范化输入时避免“除以零”错误
  • bnMom:控制移动平均线的动量

现在让我们看看函数的其余部分。

首先,我们初始化(标识)快捷方式(连接),它实际上只是对输入数据的引用。在残差模块的末尾,我们只需将快捷方式添加到我们的预激活/瓶颈分支(第3行)的输出中。

在第6-9行,ResNet模块的第一个块遵循BN ==> RELU ==> CONV ==>模式。CONV层通过K / 4滤波器使用1x1卷积。请注意,CONV层的偏置项已关闭,因为偏差已经在以下BN层中,因此不需要第二个偏置项。

根据瓶颈,第二个CONV层学习3 x 3的K / 4滤波器。

最后一个块将再次增加维度,应用尺寸为1 x 1的K滤镜。

为避免应用最大池,我们需要检查是否需要减少空间维度。

如果我们被命令减少空间尺寸,则步幅> 1的卷积层将应用于快捷方式(第2-4行)。

最后,我们将快捷方式和最终CONV层相加,创建输出到我们的ResNet模块(第7行)。我们终于有了“构建模块”来开始构建我们的深度剩余网络。

让我们开始构建构建方法。

看一下参数阶段和过滤器(两个都是列表)。在我们的架构中(如上所示),我们将N个剩余模块堆叠在一起(N =阶段值)。同一阶段中的每个残余模块学习相同数量的过滤器。在每个阶段学习其各自的过滤器之后,接着是降维。我们重复此过程,直到我们准备应用平均合并层和softmax分类器。

阶段和过滤器

例如,让我们设置阶段=(3,4,6)和滤波器=(64,128,256,512)。第一个滤波器(64)应用于唯一的CONV层,而不是剩余模块的一部分 - 网络中的第一个CONV层。然后,三个(阶段= 3)残差模块堆叠在彼此之上 - 每个模块将学习128个过滤器。空间维度将减少,然后我们将四个(阶段= 4)残差模块堆叠在一起 - 每个学习256个过滤器。最后,我们再次减少空间维度,继续将六个(阶段= 6)残差模块堆叠在一起,每个模块学习512个过滤器。

ResNet架构。带圆圈的数字是过滤器值,而括号显示堆栈。注意每个阶段后如何减少维数。与之前的书面例子无关。

让我们回到构建构建方法。

根据我们是使用“最后通道”还是“通道优先”排序(第3-4行)初始化inputShape和chanDim。

如上所述,ResNet使用BN作为第一层作为输入标准化的附加级别(第2-4行)。然后,我们应用CONV =>,BN => ACT => POOL来减小空间大小(第7-13行)。现在,让我们开始将残留层堆叠在一起。

为了在不使用池化层的情况下减小体积大小,我们可以改变卷积的步幅。阶段中的第一个条目将具有(1,1)的步幅 - 表示没有下采样。然后,在此之后的每个阶段,我们将应用具有(2,2)步幅的残余模块,这将减小体积大小。这在第5行显示。

然后,我们在第10-13行循环遍历当前阶段的层数(将堆叠在彼此之上的剩余模块的数量)。我们使用[i + 1]作为过滤器的索引,因为已经使用了第一个过滤器。一旦我们将阶段[i]残余模块堆叠在彼此之上,我们将返回到第6-7行,在那里我们减小体积的空间维度并重复该过程。

为避免密集的完全连接层,我们将应用平均池而不是将卷大小减小到1 x 1 x类:

最后,我们将为我们要学习的类的总数创建一个密集层,然后应用softmax激活来生成我们的最终输出概率!

结束了我们的构建功能,现在我们拥有完全构建的ResNet模型!您可以调用此类在深度学习项目中实现ResNet体系结构。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表