ResNet学习笔记

笔记更新中 ---------------------


目录

两种结构

block细节


ResNet 分为 resnet18、resnet34、resnet50、resnet101、resnet152

把他们分为两种,其中( resnet18、resnet34 )是一组;(resnet50、resnet101、resnet152 )是一组。

两个不同的组分别使用下面两种不同的残差块(ResNet block),分别为两层的 basicblock 结构和三层的 bottleneck 结构。

其中深层次时 bottleneck 使用的参数远远少于 basicblock ,故50往上的结构都用 bottleneck 的 block。

两种结构

basicblock
bottleneck

总体结构

  • 虚线残差结构:会改变输入的c或者h、w再往下拼贴。
  • 实线残差结构:只是原封不动地把输入拼贴下来

block细节

50以上的conv2的第一个block
  • resnet34以下:conv2接收到的是正常的,所以除了conv2,后面每个conv的第一个block都会使用虚线残差结构。因为在主分支里面已经通过卷积翻倍了c,所以在通过不同的conv层时通过捷径分支翻倍c升高维度与正常输出维度相同,以同维度拼贴(逐个元素相加,不改变任一维度)。
  • resnet50以上:每个bottleneck会把c翻4倍,所以连conv2的第一个残差结构捷径分支输出直接去和主分支的输出相加都是维度不匹配的。所以conv2开始第一个block就要用虚线结构(这是和34不同的地方),但是这里捷径分支只调整channel维度,高和宽不变(而conv3_x, conv4_x, conv5_x所对应的一系列残差结构的第一层虚线残差结构不仅要调整channel还要将高和宽缩减为原来的一半,和34的一样)。

        另外:在50以上的block中最后一个卷积把c扩大四倍,通过这种设计,虽然在中间层(1x1和3x3卷积)通道数可能较少,但最终输出的特征图有更多的通道。这种结构有助于网络在特征学习过程中捕捉到更多的信息。 

  expansion = 4 的设计允许Bottleneck结构在保留计算效率的同时,增强模型的特征表达能力,使得深层网络能够学习到更丰富和复杂的特征。

### ResNet50模型学习笔记概述 ResNet50是一种深度残差网络,属于ResNet系列的一部分。该模型通过引入残差块解决了深层神经网络中的梯度消失和退化问题[^1]。 #### 模型架构特点 ResNet50采用了特殊的Bottleneck结构作为其基本构建单元,这种设计使得即使在网络非常深的情况下也能有效传播梯度并保持良好的性能表现[^2]。具体来说: - 输入图像尺寸通常设定为\(224 \times 224\)像素,并且具有三个颜色通道。 - 经过一系列卷积操作以及多个阶段的Bottleneck模块处理之后,最终特征图会被压缩到\((2048, 1, 1)\)的形式。 - 接下来是一个全连接层用于分类任务,它将上述高维向量映射至指定数量的目标类别上。 #### 关键技术组件 为了提高训练效率与准确性,ResNet50还集成了如下重要机制: - **Batch Normalization (BN)**:应用于每一层之前来标准化激活值分布,从而加快收敛速度并且有助于缓解内部协变量偏移现象[^5]。 - **跳跃连接(Skip Connections)**:允许信息绕过多层传递,在一定程度上克服了传统CNN难以优化极深层次的问题。 ```python import torch.nn as nn class Bottleneck(nn.Module): expansion = 4 def __init__(self, inplanes, planes, stride=1, downsample=None): super(Bottleneck, self).__init__() self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False) self.bn1 = nn.BatchNorm2d(planes) self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(planes) self.conv3 = nn.Conv2d(planes, planes * self.expansion, kernel_size=1, bias=False) self.bn3 = nn.BatchNorm2d(planes * self.expansion) self.relu = nn.ReLU(inplace=True) self.downsample = downsample self.stride = stride def forward(self, x): residual = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) out = self.relu(out) out = self.conv3(out) out = self.bn3(out) if self.downsample is not None: residual = self.downsample(x) out += residual out = self.relu(out) return out ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值