一文搞懂CNN经典架构-EfficientNet!
推荐直接网站在线阅读https://aicoting.cn随着深度学习的发展CNN 的精度不断提升但代价是网络越来越深、参数越来越多。例如 VGG-19 有 144M 参数ResNet-152 计算量达到 11.3 GFLOPs。这在实际应用如移动端推理中非常昂贵。2019 年谷歌团队提出 EfficientNet其核心思想是通过一种系统化的复合缩放Compound Scaling方法在计算量可控的前提下提升模型精度。EfficientNet 在 ImageNet 上取得了 SOTA 性能同时参数量和计算量都显著减少。核心思想传统 CNN 的扩展方式主要有三种加深Depth增加网络层数。加宽Width增加每层的通道数。加大分辨率Resolution输入更高分辨率的图像。但简单地单独扩展某一个维度往往无法获得最优效果。EfficientNet 提出 复合缩放公式d e p t h α ϕ , w i d t h β ϕ , r e s o l u t i o n γ ϕ depth \alpha^\phi, \quad width \beta^\phi, \quad resolution \gamma^\phidepthαϕ,widthβϕ,resolutionγϕ其中α , β , γ \alpha, \beta, \gammaα,β,γ是常数超参数用来控制三个维度的比例ϕ \phiϕ是一个用户定义的全局系数决定计算资源的放大倍数。这种方法保证了 深度、宽度和分辨率的协调扩展避免了资源浪费。网络结构EfficientNet 的基础网络是 EfficientNet-B0它由 MobileNetV2 的倒残差结构MBConv演化而来并结合 Squeeze-and-Excitation (SE) 注意力模块。EfficientNet-B0 的设计包括Stem3×3 卷积输出 32 通道。MBConv Blocks若干个倒残差模块扩展卷积 → 深度卷积 → SE 模块 → 压缩卷积。Head1×1 卷积扩展通道数全局平均池化全连接层输出分类结果。通过复合缩放方法EfficientNet 系列扩展为 B0 ~ B7B0基准网络约 5.3M 参数。B7最深最大版本约 66M 参数。关键优势系统化扩展通过复合缩放方法解决了 CNN 扩展的非最优问题。高效性在相同精度下参数量和计算量比 ResNet、DenseNet 显著减少。性能强大在 ImageNet 上EfficientNet-B7 Top-1 精度达到 84.3%远超同类模型。可迁移性好在目标检测、分割和医疗影像等下游任务中表现优异。示例代码我们用 PyTorch 实现一个简化版 EfficientNet-B0仅示例不完全复现所有细节并在 CIFAR-10 数据集上演示。importtorchimporttorch.nnasnnimporttorch.optimasoptimfromtorchvisionimportdatasets,transformsfromtorch.utils.dataimportDataLoader# Squeeze-and-Excitation 模块classSEModule(nn.Module):def__init__(self,channels,reduction4):super(SEModule,self).__init__()self.fc1nn.Conv2d(channels,channels//reduction,kernel_size1)self.relunn.ReLU(inplaceTrue)self.fc2nn.Conv2d(channels//reduction,channels,kernel_size1)self.sigmoidnn.Sigmoid()defforward(self,x):wtorch.mean(x,dim(2,3),keepdimTrue)# 全局平均池化wself.fc1(w)wself.relu(w)wself.fc2(w)wself.sigmoid(w)returnx*w# MBConv 模块classMBConv(nn.Module):def__init__(self,in_channels,out_channels,expansion6,stride1,use_seTrue):super(MBConv,self).__init__()mid_channelsin_channels*expansion self.use_residual(stride1andin_channelsout_channels)layers[]ifexpansion!1:layers.append(nn.Conv2d(in_channels,mid_channels,kernel_size1,biasFalse))layers.append(nn.BatchNorm2d(mid_channels))layers.append(nn.ReLU6(inplaceTrue))layers.extend([nn.Conv2d(mid_channels,mid_channels,kernel_size3,stridestride,padding1,groupsmid_channels,biasFalse),nn.BatchNorm2d(mid_channels),nn.ReLU6(inplaceTrue),])ifuse_se:layers.append(SEModule(mid_channels))layers.extend([nn.Conv2d(mid_channels,out_channels,kernel_size1,biasFalse),nn.BatchNorm2d(out_channels)])self.convnn.Sequential(*layers)defforward(self,x):outself.conv(x)ifself.use_residual:returnxoutelse:returnout# EfficientNet-B0 简化版classEfficientNetB0(nn.Module):def__init__(self,num_classes10):super(EfficientNetB0,self).__init__()self.stemnn.Sequential(nn.Conv2d(3,32,kernel_size3,stride1,padding1,biasFalse),nn.BatchNorm2d(32),nn.ReLU6(inplaceTrue))self.blocksnn.Sequential(MBConv(32,16,expansion1,stride1),MBConv(16,24,stride2),MBConv(24,40,stride2),MBConv(40,80,stride2),MBConv(80,112,stride1),MBConv(112,192,stride2),MBConv(192,320,stride1))self.headnn.Sequential(nn.Conv2d(320,1280,kernel_size1,biasFalse),nn.BatchNorm2d(1280),nn.ReLU6(inplaceTrue),nn.AdaptiveAvgPool2d((1,1)),)self.fcnn.Linear(1280,num_classes)defforward(self,x):xself.stem(x)xself.blocks(x)xself.head(x)xtorch.flatten(x,1)xself.fc(x)returnx# 数据预处理CIFAR-10transformtransforms.Compose([transforms.Resize(224),transforms.ToTensor(),transforms.Normalize((0.5,0.5,0.5),(0.5,0.5,0.5))])train_datasetdatasets.CIFAR10(root./data,trainTrue,transformtransform,downloadTrue)train_loaderDataLoader(train_dataset,batch_size64,shuffleTrue)# 初始化模型、损失函数和优化器devicetorch.device(cudaiftorch.cuda.is_available()elsecpu)modelEfficientNetB0(num_classes10).to(device)criterionnn.CrossEntropyLoss()optimizeroptim.Adam(model.parameters(),lr0.001)# 简单训练循环forepochinrange(1):forbatch_idx,(data,target)inenumerate(train_loader):data,targetdata.to(device),target.to(device)outputsmodel(data)losscriterion(outputs,target)optimizer.zero_grad()loss.backward()optimizer.step()ifbatch_idx%1000:print(fEpoch [{epoch1}], Step [{batch_idx}], Loss:{loss.item():.4f})EfficientNet 提出了 复合缩放 的方法系统化地平衡了网络的深度、宽度和分辨率从而在精度和效率之间取得了最佳平衡。它在 ImageNet 和下游任务上都取得了出色表现成为轻量化 CNN 的代表之一。最新的文章都在公众号aicoting更新别忘记关注哦推荐阅读一文搞懂深度学习中的池化面试官给我讲一下卷积吧一文搞懂卷积神经网络面试官正则化都有哪些经典的方法面试官你在训模型的时候经常使用的学习率策略有哪些面试官深度学习中经典的优化算法都有哪些一文搞懂深度学习中的通用逼近定理一文搞懂深度学习中的表征学习理论一文搞懂深度学习中的信息论一文搞懂深度学习的反向传播与优化理论最新的文章都在公众号aicoting更新别忘记关注哦作者aicoting分享是一种信仰连接让成长更有温度。我们下次不见不散