【第3周】ResNet+ResNeXt

ResNet网络

1.1 网络亮点

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

下图左边是简单的将网络进行更深的叠加,但是可以看出,不是简单的将网络进行叠加效果就一定更好。而右边是使用到ResNet网络的结果。可以看出效果明显要更加优秀。

右边半包裹箭头如果是实线 ,表明输入特征矩阵的shape和输出特征矩阵的shape是一模一样的。所以我们可以直接进行相加。

但是虚线部分,我们会发现输入部分和输出部分是不一样的。步距发生了变化。

1.2 Batch Normalization

是为了使我们一批数据的feature map每一个维度,也就是每一个channel的维度满足均值为0,方差为1的分布律。

 

使用时需要注意的问题:

  • 训练时要将training参数设置为True,在验证时将trainning参数设置为False。在pytorch中可通过创建模型的model.train()和model.eval()方法控制。
  • batch size尽可能设置大点,设置小后表现可能很糟糕,设置的越大求的均值和方差越接近整个训练集的均值和方差。
  • 建议将bn层放在卷积层(Conv)和激活层(例如Relu)之间,且卷积层不要使用偏置bias,因为没有用,参考下图推理,即使使用了偏置bias求出的结果也是一样的

1.3 迁移学习

  • 能够快速的训练出一个理想的结果
  • 当数据集较小的时候也能训练出理想的效果

2 ResNeXt网络

对残差结构进行了更新(左边为原本的残差结构,右边为升级后的)

3 代码作业

3.1 使用类似LeNet网络进行分类

网络结构如下所示:

class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, kernel_size=5)
        self.conv2 = nn.Conv2d(6, 16, kernel_size=5)
        self.fc1 = nn.Linear(16*5*5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 2)  # 最终输出2个类别(猫和狗)

    def forward(self, x):
        x = nn.functional.relu(self.conv1(x))
        x = nn.functional.max_pool2d(x, 2)
        x = nn.functional.relu(self.conv2(x))
        x = nn.functional.max_pool2d(x, 2)
        x = x.view(x.size(0), -1)
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.relu(self.fc2(x))
        x = self.fc3(x)
        return x

结果如下所示,效果比较一般:

 

4 思考

4.1 Residual learning 的基本原理?

残差学习提出了一种跳远连接(skip connection)的思想。在残差块中,输入数据首先经过一个普通的映射函数(如卷积层和激活函数),然后与原始输入进行相加操作。这个相加操作使得网络有能力学习输入和输出之间的残差信息。

通过引入残差块,深层网络可以通过学习残差来逐渐逼近期望的映射函数。即使网络层数较多,梯度也能够更容易地在跳远连接中传播,避免了梯度消失问题。

4.2 Batch Normailization 的原理,思考 BN、LN、IN 的主要区别。

Batch Normalization 的原理如下:

  1. 对于每个小批量的输入数据,计算其均值和方差。
  2. 对输入数据进行归一化,即减去均值并除以方差。
  3. 对归一化后的数据进行线性变换和缩放,恢复其表示能力。
  4. 使用学习的参数对归一化后的数据进行偏移,进一步调整表示能力。

BN处理的是一批样本的同一维度,LN处理的是一个样本的所有维度,IN处理的是一个样本的一个维度。LN对一个样本的所有通道求均值和方差,再归一化该样本的所有通道上的值。IN对一个样本的一个通道求均值和方差,再归一化该通道上的值。

4.3 为什么分组卷积可以提升准确率?即然分组卷积可以提升准确率,同时还能降低计算量,分数数量尽量多不行吗?

分组卷积通过增加网络的非线性表示能力和减轻参数量和计算量的负担来提升准确率。

虽然分数数量尽量多可以增加模型的表示能力,但同时也会带来更多的参数和计算量。过多的分组数量可能会导致模型过于复杂,容易过拟合数据,而且增加了训练的难度。同时,分组数量过多也会限制每个组内部的通道数目,可能导致每个组内的特征提取能力下降。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值