EfficientNet笔记

1. EfficientNet网络介绍

1.1 影响精度的原因

  1. 网络深度的增加,典型的如resnet,就是通过残差网络的堆叠,增加网络层数,以此来提升精度。
  2. 网络宽度的增加,通过增加每层网络的特征层数,提取更多的特征,以此来提升精度。
  3. 图像分辨率的增加,分辨率越高的图像,所能获取的信息越多,网络能够学习到更多的特征,从而提升精度

EfficientNet则是为了平衡这三个因素

  • 根据以往的经验,增加网络的深度depth能够得到更加丰富、复杂的特征并且能够很好的应用到其它任务中。但网络的深度过深会面临梯度消失,训练困难的问题。
  • 增加网络的width能够获得更高细粒度的特征并且也更容易训练,但对于width很大而深度较浅的网络往往很难学习到更深层次的特征。
  • 增加输入网络的图像分辨率能够潜在得获得更高细粒度的特征模板,但对于非常高的输入分辨率,准确率的增益也会减小。并且大分辨率图像会增加计算量

1.2 MBconv结构

MBConv其实就是MobileNetV3网络中的InvertedResidualBlock,但也有些许区别。一个是采用的激活函数不一样(EfficientNet的MBConv中使用的都是Swish激活函数),另一个是在每个MBConv中都加入了SE(Squeeze-and-Excitation)模块。

1.3 EfficientNet参数

 

 2. EfficientNetV2网络介绍

2.1 EfficientNet的不足

1.EfficientNet的大图像尺寸导致了大量的内存使用。

由于GPU/TPU上的总内存是固定的,因此必须用更小的批量来训练这些模型,这大大减慢了训练的速度

2. DW卷积比常规卷积有更少的参数和FLOPs,但它们往往不能充分利用现代加速器。

在1-3阶段早期应用fused- mbconv可以提高训练速度,在参数和FLOPs上的开销较小,但如果将所有块替换为fused- mbconv(阶段1-7),则会显著增加参数和FLOPs,同时也会减慢训练速度。

3. 同等的放大每个stage是次优的。

 在EfficientNetV1中,每个stage的深度和宽度都是同等放大的。但每个stage对网络的训练速度以及参数数量的贡献并不相同,所以直接使用同等缩放的策略并不合理。在这篇文章中,作者采用了非均匀的缩放策略来缩放模型 

2.2 Dropout正则化

def drop_path(x, drop_prob: float = 0., training: bool = False):
    """
    Drop paths (Stochastic Depth) per sample (when applied in main path of residual blocks).
    """
    if drop_prob == 0. or not training:     
        return x
    keep_prob = 1 - drop_prob       # 保留的比率
    shape = (x.shape[0],) + (1,) * (x.ndim - 1)  # 形成一个与X形状一样,除了第一个数字,其他都是0的张量
    random_tensor = keep_prob + torch.rand(shape, dtype=x.dtype, device=x.device)#torch.rand形成0-1的随机数
    random_tensor.floor_()  #   二值化小于1的为0,大于1的为1
    # ---------------------------------------------------------------------------------------#
    #   对x先进行x.div(keep_prob)的放缩,这是为什么?
    #   回答:对权值放缩是为了获得输出的一致性,即期望不变。
    #       假设一个神经元的输出激活值为a,在不使用dropout的情况下,
    #       其输出期望值为a,如果使用了dropout,神经元就可能有保留和关闭两种状态,
    #       把它看作一个离散型随机变量,它就符合概率论中的0-1分布,
    #       其输出激活值的期望变为 p*a+(1-p)*0=pa,此时若要保持期望和不使用dropout时一致,就要除以p。
    # ---------------------------------------------------------------------------------------#
    output = x.div(keep_prob) * random_tensor #.div(keep_prob)#表示x除概率,即p/a
    return output
class DropPath(nn.Module):
    """
    Drop paths (Stochastic Depth) per sample  (when applied in main path of residual blocks).
    "Deep Networks with Stochastic Depth", https://arxiv.org/pdf/1603.09382.pdf
    """
    def __init__(self, drop_prob=None):
        super(DropPath, self).__init__()
        self.drop_prob = drop_prob

    def forward(self, x):
        return drop_path(x, self.drop_prob, self.training)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值