ResNet与ResNeXt

一、ResNet

论文:Deep Residual Learning for Image Recognition

ResNet网络中的亮点:

  • 超深的网络结构(突破1000层)
  • 提出residual模块
  • 使用Batch Normalization加速训练(丢弃dropout)

论文中提到,简单的堆叠卷积层与池化层并不能降低错误率,通过堆叠卷积层与池化层,会带来梯度消失或梯度爆炸、退化问题。

 ResNet不同的网络结构的错误率如下所示:

 网络中残差结构如下所示:

 主分支与shortcut的输出特征矩阵shape必须相同。

不同层数的ResNet网络结构对比如下:

Batch Normalization

Batch Normalization的目的是使一批(Batch)feature map满足均值为0,方差为1的分布规律。它可以加速网络的训练,还可以提升准确率。

使用BN时需要注意的问题:

(1)训练时要将training参数设置为True,验证时将training参数设置为False,在pytorch中可以通过创建模型的model.train()和model.eval()控制。

(2)batch.size尽可能大,设置的越大求得均值和方差越接近整个训练集的均值和方差。

(3)建议将BN层放到卷积层与激活层之间,且卷积层不要使用bias。

迁移学习:

使用迁移学习的优势:

(1)能够快速的训练出一个理想的效果

(2)当数据集较小时,也能训练出理想的效果

常见的迁移学习的方式:

(1)载入权重后训练所有参数

(2)载入权重后只训练最后几层参数

(3)载入权重后在原网络基础上再添加一层全连接层,仅训练最后一个全连接层

二、ResNeXt

论文:Aggregated Residual Transformations for Deep Neural Networks

ResNeXt相比于ResNet来说,更新了block。

 左图是ResNet中的一个block,右图是ResNeXt中的block。ResNeXt中使用Group Convolution,使用的参数量更小。

ResNeXt在计算量相同的情况下,错误率更低。

上面这三种结构在数学计算上是等价的。

不过分组卷积并不是分组数量越多越好。

三、猫狗大战

首先使用LeNet网络进行训练。

由于数据集比较大,训练时间比较长,本次采用了老师之前博客里提供的2000张训练图片的小数据集。

首先加载数据集:

 引入必要的库

 添加训练图片和测试图片的路径

 创建数据集

 定义网络

 把网络放到GPU上开始训练

 进行测试并导出结果文件

 提交结果为:

 将网络结构改为ResNet,这里使用了ResNet18:

 提交结果为:

 可以看出,ResNet网络在分类问题上具有明显优势。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在SlowFast模型中将ResNet-50替换为ResNeXt-50是可行的。以下是一种可能的实现方法: 1. 首先,导入所需的库和模型: ```python import torch import torchvision.models as models from torchvision.models.resnet import Bottleneck # 导入SlowFast模型 from slowfast.models.video_model_builder import SlowFast ``` 2. 定义ResNeXt-50模型: ```python class ResNeXt(models.ResNet): def __init__(self, block, layers, num_classes=1000, zero_init_residual=False, groups=32, width_per_group=4, replace_stride_with_dilation=None, norm_layer=None): super(ResNeXt, self).__init__(block, layers, num_classes, zero_init_residual, groups, width_per_group, replace_stride_with_dilation, norm_layer) def _forward_impl(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 def _resnext(arch, block, layers, pretrained, progress, **kwargs): model = ResNeXt(block, layers, **kwargs) if pretrained: state_dict = torch.load(pretrained) model.load_state_dict(state_dict) return model def resnext50(pretrained=False, progress=True, **kwargs): return _resnext('resnext50', Bottleneck, [3, 4, 6, 3], pretrained, progress, **kwargs) ``` 3. 替换SlowFast模型中的ResNet-50为ResNeXt-50: ```python slowfast = SlowFast(resnet_depth=50, num_classes=400) # 加载预训练的ResNeXt-50模型 resnext = resnext50(pretrained=True) # 替换SlowFast模型中的ResNet-50为ResNeXt-50 slowfast.s1_net = resnext ``` 现在,SlowFast模型中的ResNet-50已被成功替换为ResNeXt-50。你可以继续使用slowfast进行训练或推理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值