EfficientNet笔记

传统的三个方式:扩大输入的分辨率、扩大深度、扩大宽度
在这里插入图片描述
(a)是基本模型,(b)是增加宽度,(c)是增加深度,(d)是增大属兔图像分辨率,(d)是EfficientNet,它从三个维度均扩大了,但是扩大多少,就是通过作者提出来的 复合模型扩张方法 结合 神经结构搜索 技术获得的。

作者指出,模型扩张的各个维度之间并不是完全独立的,比如说,对于更大的分辨率图像,应该使用更深、更宽的网络,这就意味着需要平衡各个扩张维度,而不是在单一维度张扩张。

如下图所示,直线上的每个点表示具有不同宽度系数(w)的模型。第一个基线网络(d=1.0,r=1.0)有18个卷积层,分辨率224x224,而最后一个基线(d=2.0,r=1.3)有36个卷积层,分辨率299x299。这个图说明了一个问题,为了追求更好的精度和效率,在ConvNet缩放过程中平衡网络宽度、深度和分辨率的所有维度是至关重要的。

在这里插入图片描述
在这里插入图片描述
固定公式中的φ=1,然后通过网格搜索(grid search)得出最优的α、β、γ,得出最基本的模型EfficientNet-B0.
固定α、β、γ的值,使用不同的φ,得到EfficientNet-B1, …, EfficientNet-B7
φ的大小对应着消耗资源的大小,相当于:

当φ=1时,得出了一个最小的最优基础模型;
增大φ时,相当于对基模型三个维度同时扩展,模型变大,性能也会提升,资源消耗也变大。
在这里插入图片描述
深度可分离卷积
用的是groups来控制,groups=in_channel~~

    def _conv_dw(self, in_channels, out_channels, stride):
        return nn.Sequential(
            nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=stride, padding=1, groups=in_channels, bias=False),
            nn.BatchNorm2d(in_channels),
            nn.ReLU(),
            nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, padding=0, bias=False),
            nn.BatchNorm2d(out_channels),
            nn.ReLU(),
        )

在这里插入图片描述
b1 - b7都是b0—主要是深度可分离卷积 + SE模块 扩充的,所以没啥好记得,就是根据搜索得到的好的结构。参数主要是宽度,深度,dropout,输入的分辨率。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/caihuanqia/article/details/113957437
今日推荐