首页 > 其他分享 >深度学习pytorch——经典卷积网络之ResNet(持续更新)

深度学习pytorch——经典卷积网络之ResNet(持续更新)

时间:2024-03-30 13:03:57浏览次数:22  
标签:ch nn 卷积 self ResNet 堆叠 pytorch out

错误率前五的神经网络(图-1):

图-1

可以很直观的看到,随着层数的增加Error也在逐渐降低,因此深度是非常重要的,但是学习更好的网络模型和堆叠层数一样简单吗?通过实现表明(图-2),并不是如此,会出现梯度消失和梯度爆炸的现象,甚至比堆叠之前的训练效果更差,这种现象被称为梯度退化。 

图-2

如何保证梯度不退化,即随着堆叠层数的增加,训练模型不会比堆叠之前还要差?深度残差网络(Deep Residual Learning,ResNet)的提出很好的解决了这一问题,并且不仅没有增加额外的参数,也没有增加计算的复杂度。

ResNet在普通网络的基础上插入了短路(shortcut connection)(图-3),将这个网络变成了ResNet。

图-3

以上的叙述知识思想层面的,将思想转化为实操,离不开背后的数学原理(图-4)。

图-4

我们将最后的输出设置为 H(x)  ,我们将堆叠的非线性层去拟合F(x) = H(x) - x ,原来的映射就变成了F(x) + x (F(x)必须和x的维度相同,如果不相同可是使用1*1卷积或者增加padding)。相当于我们在一些非线性对叠层之间插入了一个短路(shortcut connection),如果堆叠之后的模型的训练Error比之前还要差,就会直接走短路通道,如果堆叠之后的模型比之前好了,就进行堆叠,至于在几个堆叠层之间插入一个短路,这取决于训练的参数。

使用ResNet模型并不需要建立新的求解器,我们可以直接使用公共库,代码演示如下:

class ResBlk(nn.Module):
    """
    resnet block
    """

    def __init__(self, ch_in, ch_out):
        """
        :param ch_in:
        :param ch_out:
        """
        super(ResBlk, self).__init__()

        self.conv1 = nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1)
        self.bn1 = nn.BatchNorm2d(ch_out)
        self.conv2 = nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1)
        self.bn2 = nn.BatchNorm2d(ch_out)

        #如果shortcut的输入和输出层的channel不一样,可以用一个1*1的卷积让他们变成一样

        self.extra = nn.Sequential()
        if ch_out != ch_in:
            # [b, ch_in, h, w] => [b, ch_out, h, w]
            self.extra = nn.Sequential(
                nn.Conv2d(ch_in, ch_out, kernel_size=1, stride=1),
                nn.BatchNorm2d(ch_out)
            )


    def forward(self, x):
        """
        :param x: [b, ch, h, w]
        :return:
        """
        out = F.relu(self.bn1(self.conv1(x)))  #激活函数,也可以在上面的网络(第25行)写nn.ReLU
        out = self.bn2(self.conv2(out))
        # short cut.
        # extra module: [b, ch_in, h, w] => [b, ch_out, h, w]
        # element-wise add:
        out = self.extra(x) + out

        return out

这个代码来自于课时72 ResNet与DenseNet-2_哔哩哔哩_bilibili 

中间关于这个思想的解释来自于我自己对Deep Residual Learning for Image Recognition 论文的理解,如果有什么问题,欢迎各位大佬指正,我将会感激不尽。 

标签:ch,nn,卷积,self,ResNet,堆叠,pytorch,out
From: https://blog.csdn.net/2201_76139143/article/details/137131891

相关文章

  • 深度学习pytorch——nn.Module(持续更新)
    作为一个初学者,发现构建一个简单的线性模型都能看到nn.Module的身影,初学者疑惑了,nn.Module到底是干什么的,如此形影不离,了解之后,很牛。1、nn.Module是所有层的父类,比如Linear、BatchNorm2d、Conv2d、ReLU、Sigmoid、ConvTranposed、Dropout等等这些都是它的儿子(子类),你可以直接......
  • 深度学习-卷积神经网络--Unet训练推理-60
    目录网络结构importtensorflowastfimportosimportsysimportnumpyasnpfromtqdmimporttqdmfromitertoolsimportchainfromskimage.ioimportimread,imshowfromskimage.transformimportresizeimportrandomimportmatplotlib.pyplotaspltpri......
  • 【即插即用】GnConv递归门控卷积(附源码)
    论文地址:https://arxiv.org/abs/2207.14284源码地址:https://github.com/raoyongming/HorNetGnConvGnConvHorNet摘要简介:最近,视觉Transformer在各种任务中取得了巨大成功,这主要得益于基于点积自注意力的新型空间建模机制。在本文中,我们发现视觉Transformer的关键要素,即输......
  • 上采样 转置卷积
    参考https://blog.csdn.net/qq_37541097/article/details/120709865"""importtensorflowastfimportnumpyasnpfromskimage.ioimportimread,imshow,show输入:1张图片,尺寸28*28高宽,通道数3x=np.ones((1,28,28,3),dtype=np.float32)x=imread('......
  • 一行一行讲解深度学习代码(零)如何利用pytorch搭建一个完整的深度学习项目——深度学习
    本文适合没有基础的pytorch深度学习小白和python基础不太好的同学!!建议有基础的同学不要看~文章目录深度学习项目的大致结构(一)数据集加载1.功能2.工具(1)datasets(2)DataLoader(二)数据预处理1.功能2.工具(1)torchvision.transforms(2)Compose()3.实战(1)定义数据集(2)数据预处理......
  • pytorch的基础函数
    [torch.arange]是PyTorch中的一个函数,用于生成一个一维的张量(tensor),其中包含从起始值(包括)到结束值(不包括)的等差数列。这个函数非常类似于Python的内置range函数,但是生成的是PyTorch张量而不是Python列表。torch.arange(start=0,end,step=1,*,out=None,dtype=No......
  • Ubuntu22.04下Issac Gym/宇树机器人RL&gcc/g++,CUDA,CUDA ToolKit,Pytorch配置环境配
    前置条件本随笔写作Condition:在本人3050Ti笔记本上配好环境后,再在室友4060笔记本上边配边记录整理所得。室友的系统已经配好了相应驱动,因此,本随笔内容基于已经安装了NVIDIA显卡驱动的系统。下次搞到没装驱动的系统我再补一个随笔。宇树机器人宇树科技的文档中心有一个简单的安......
  • Yolov8-pose关键点检测:block涨点篇 | PKIBlock多尺度卷积核,优势无需膨胀,即插即用小目
      ......
  • 毕业设计:基于深度学习的农作物病虫害识别系统 深度卷积 人工智能 机器视觉
    目录前言设计思路一、课题背景与意义二、算法理论原理2.1卷积神经网络2.2YOLOv5s算法三、检测的实现3.1数据集3.2实验环境搭建3.3实验及结果分析最后前言    ......
  • CF EDU163 F-组合数、范德蒙德卷积
    “总感觉这题是诈骗题…”link:https://codeforces.com/contest/1948/problem/F[!题意]有\(n\)个袋子,每个袋子有\(a_i\)个金币,\(b_i\)个银币,金币的价格固定是\(1\),每个银币的价格服从\(B(1,\frac{1}{2})\)的分布。\(q\)次询问,每次问一段区间\([l,r]\)内背包总的......