56、resnet中的下采样

本文介绍了ResNet神经网络中下采样的概念和作用,包括通过步长为2的卷积层及最大池化层实现下采样,下采样能减少计算量,增加感受野,防止过拟合,并使网络学习更抽象的特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一节是算法原理和背景的最后一章节,下一节开始进入实战部分。

如果你从第一节看到这一节,这总共56节的内容基本上都能理解的话,那么恭喜你,算法原理部分已经掌握了,也基本接近入门了。

总结一下算法原理的部分,介绍了传统计算机视觉的一些算法,比如滤波算法,然后介绍了一些深度学习的基础概念,包括训练和推理,正向传播,反向传播和损失函数。

随后重点介绍了resnet这一神经网络中用到的算法,包括卷积算法,批归一化算法,池化算法,激活函数,还有矩阵乘算法,以及每一个算法的原理和优势。

最后面的几节介绍了全连接算法,交叉熵损失函数,还有softmax算法。

同时在介绍一些常见算法的过程中,夹杂了一些算法的代码实现,这些实现是最原始的实现版本,只是实现功能,后面代码实战部分会逐步进行性能优化。

在进入实战之前,本节再继续介绍一下 resnet 这个神经网络中存在的一个概念,叫做下采样。

resnet 中的下采样

所谓下采样,我们可以通俗的理解为将原始输入的像素点数进行采样,采样的结果是输出的像素点数小于输入的像素点数,也就是采样。

要实现下采样,有很多

### ResNet18 的深度学习模型结构及其实现 #### 1. 模型概述 ResNet18 是一种由何恺明等人提出的卷积神经网络架构,属于残差网络系列的一部分。它通过引入残差连接解决了深层神经网络中的梯度消失问题,使得训练更深的网络成为可能[^1]。 #### 2. 网络结构详解 ResNet18 主要由多个 BasicBlock 构成,这些基本模块是浅层残差网络的核心组成部分。每个 BasicBlock 包含两个 3×3 卷积层以及一个用于跨阶段维度匹配的 shortcut 连接。对于较深的网络(如 ResNet50 及以上),则会采用 Bottleneck 结构来替代 BasicBlock[^2]。 以下是 ResNet18 的主要组成部分: - **输入层**:通常接受大小为 \(224 \times 224\) 或其他尺寸的图像作为输入。 - **初始卷积层**:包含一个 \(7 \times 7\) 的卷积核,步幅为 2,通道数为 64,后面跟着批量归一化 (Batch Normalization) 和 ReLU 激活函数。 - **最大池化层**:使用 \(3 \times 3\) 的窗口进行下采样,步幅为 2。 - **四个残差块组**:分别对应不同的特征图分辨率和通道数量。具体如下表所示: | 层次 | 输出形状 | 块的数量 | 特征图大小 | |------------|------------------|----------|-------------| | conv2_x | \(C=64\) | 2 | \(56\times56\) | | conv3_x | \(C=128\) | 2 | \(28\times28\) | | conv4_x | \(C=256\) | 2 | \(14\times14\) | | conv5_x | \(C=512\) | 2 | \(7\times7\) | 每组内的第一个 BasicBlock 需要调整通道数并执行下采样操作以改变空间分辨率;其余 Block 则保持相同的空间尺寸不变[^3]。 #### 3. 实现代码示例 下面是一个基于 PyTorch 的简单实现版本: ```python import torch.nn as nn class BasicBlock(nn.Module): expansion = 1 def __init__(self, in_channels, out_channels, stride=1, downsample=None): super(BasicBlock, self).__init__() self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False) self.bn1 = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channels) self.downsample = downsample def forward(self, x): identity = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) if self.downsample is not None: identity = self.downsample(x) out += identity out = self.relu(out) return out class ResNet18(nn.Module): def __init__(self, block, layers, num_classes=1000): super(ResNet18, self).__init__() self.inplanes = 64 self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=7, stride=2, padding=3, bias=False) self.bn1 = nn.BatchNorm2d(self.inplanes) self.relu = nn.ReLU(inplace=True) self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) self.layer1 = self._make_layer(block, 64, layers[0]) self.layer2 = self._make_layer(block, 128, layers[1], stride=2) self.layer3 = self._make_layer(block, 256, layers[2], stride=2) self.layer4 = self._make_layer(block, 512, layers[3], stride=2) self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) self.fc = nn.Linear(512 * block.expansion, num_classes) def _make_layer(self, block, planes, blocks, stride=1): downsample = None if stride != 1 or self.inplanes != planes * block.expansion: downsample = nn.Sequential( nn.Conv2d(self.inplanes, planes * block.expansion, kernel_size=1, stride=stride, bias=False), nn.BatchNorm2d(planes * block.expansion), ) layers = [] layers.append(block(self.inplanes, planes, stride, downsample)) self.inplanes = planes * block.expansion for _ in range(1, blocks): layers.append(block(self.inplanes, planes)) return nn.Sequential(*layers) def forward(self, x): x = self.conv1(x) x = self.bn1(x) x = self.relu(x) x = self.maxpool(x) x = self.layer1(x) x = self.layer2(x) x = self.layer3(x) x = self.layer4(x) x = self.avgpool(x) x = torch.flatten(x, 1) x = self.fc(x) return x ``` 调用方法可以定义如下: ```python def resnet18(): return ResNet18(BasicBlock, [2, 2, 2, 2]) # 定义各层次block数目 ``` #### 4. 性能特点 相比传统 CNNs,在相同的计算资源条件下,ResNet 能够显著提升分类精度。这是因为其独特的跳跃连接机制缓解了退化现象的发生概率,从而允许构建更加复杂的深层次架构而不会损害性能表现[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

董董灿是个攻城狮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值