PyTorch实战——ResNet与DenseNet详解

PyTorch实战——ResNet与DenseNet详解

0. 前言

我们已经学习了 Inception 模型,这些模型通过 1x1 卷积和全局平均池化减少了模型参数的数量,从而避免了随着层数的增加可能导致的参数爆炸问题。此外,还通过辅助分类器缓解了梯度消失问题。在本节中,我们将讨论 ResNetDenseNet 模型。

1. ResNet

ResNet 引入了跳跃连接 (skip connections) 的概念。这种简单而有效的技巧克服了参数爆炸和梯度消失的问题。其基本思想如下图所示,输入首先经过非线性变换(卷积后跟非线性激活),然后将该变换的输出(称为残差)与原始输入相加。每个这样的计算块称为残差块,因此该模型称为残差网络 (Residual Network, ResNet):

残差块

通过使用跳跃连接(也称捷径连接),ResNet-50 (50 层)的参数数量为 2600 万。由于参数数量有限,即使层数增加到 152

### PyTorch 实战 ResNet 案例教程 #### 使用PyTorch构建ResNet模型 为了在PyTorch中实现ResNet网络,可以利用内置的`torchvision.models`模块来加载预训练模型。对于不同的应用场景,可以选择不同层数的ResNet变体,如ResNet18、ResNet34(适用于较浅层网络),以及ResNet50、ResNet101和ResNet152(针对更深层次架构)。这些模型都包含了两种主要类型的残差单元:用于浅层网络的基础块(BasicBlock),以及专为深层设计的瓶颈结构(Bottleneck)[^1]。 ```python import torchvision.models as models # 加载带有ImageNet权重的预训练ResNet50模型 model = models.resnet50(pretrained=True) for param in model.parameters(): param.requires_grad = False num_ftrs = model.fc.in_features model.fc = torch.nn.Linear(num_ftrs, num_classes) ``` #### 进行迁移学习调整 当应用到特定任务上时,通常会冻结原始卷积层参数,并仅微调全连接层部分以适应新的类别数量。这可以通过设置相应层的`.requires_grad=False`属性完成。接着修改最后一层(`fc`)使之匹配目标数据集中的类数目[^2]。 #### 训练过程配置 定义损失函数优化器之后,还需要考虑如何动态调整学习率以促进收敛速度并防止过拟合现象发生。一种常见做法就是采用阶梯式的学习率衰减策略,即每隔一定轮次降低当前学习率为原来的某个比例因子乘积形式: ```python criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9) scheduler = lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.2) ``` 上述代码片段展示了创建交叉熵损失计算方法、随机梯度下降法(SGD)作为更新规则的选择,还有通过步长(step size)控制每经过多少epoch后减少一次学习率;同时指定缩减倍数(gamma)使得每次迭代后的实际学习率等于之前值除以此系数[^4]。
评论 22
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

盼小辉丶

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

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

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

打赏作者

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

抵扣说明:

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

余额充值