目录
1.1 EfficientNet网络概述
1.2EfficientNet 性能分析
1.3EfficientNet的基本原理公式
1.4MATLAB开发方法
1.1 EfficientNet网络概述
在开发以卷积神经网络(CNN)为核心的机器学习模型时,我们通常会先使用固定的资源成本,构建最初的模型,然后增加更多资源(层数)扩展模型,获得更高的准确率。
一般来说,模型的扩大和缩小都是任意增加 CNN 的深度或宽度,抑或是使用分辨率更大的图像进行训练和评估。虽然这些传统方法提高准确率的效果不错,但大多需要繁琐的手动调整,还可能无法达到最佳性能。
因此,谷歌AI团队最近提出了新的模型缩放方法“复合缩放(Compound Scaling)”和配套的 EfficientNet 模型。他们使用复合系数和 AutoML 从多个维度均衡缩放 CNN,综合考虑深度和宽度等参数,而不是只单纯地考虑一个,使得模型的准确率和效率大幅提升,图像识别的效率甚至可以大幅提升10倍。EfficientNet 是一种高效的卷积神经网络架构,由 Google Brain 团队提出,专门用于图像分类和识别任务。它通过对网络的深度、宽度和分辨率进行统一的缩放来实现高效的模型设计,从而在保持准确性的同时降低了计算和参数量,是一种在计算资源有限的情况下获得高性能的解决方案。
这项新方法的根本优势在于实践起来非常简单,背后的原理很好理解,甚至让人怀疑为什么没有被更早发现。该研究成果以论文的形式被 ICML 2019(国际机器学习大会)接收,名为 EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks。EfficientNet 模型的相关代码和 TPU 训练数据也已经在 GitHub 上开源。
为了弄清楚神经网络缩放之后的效果,谷歌团队系统地研究了改变不同维度对模型的影响,维度参数包括网络深度、宽度和图像分辨率。首先他们进行了栅格搜索(Grid Search)。这是一种穷举搜索方法,可以在固定资源的限定下,列出所有参数之间的关系,显示出改变某一种维度时,基线网络模型会受到什么样的影响。换句话说,如果只改变了宽度、深度或分辨率,模型的表现会发生什么变化。
综合考虑所有情况之后,他们确定了每个维度最合适的调整系数,然后将它们一同应用到基线网络中,对每个维度都进行适当的缩放,并且确保其符合目标模型的大小和计算预算。
简单来说,就是分别找到宽度、深度和分辨率的最佳系数,然后将它们组合起来一起放入原本的网络模型中,对每一个维度都有所调整。从整体的角度缩放模型。与传统方法相比,这种复合缩放法可以持续提高模型的准确性和效率。在现有模型 MobileNet 和 ResNet 上的测试结果显示,它分别提高了 1.4% 和 0.7% 的准确率。
因为,为了进一步提高性能,谷歌 AI 团队还使用了 AutoML MNAS 框架进行神经架构搜索,优化准确性和效率。AutoML 是一种可以自动设计神经网络的技术,由谷歌团队在 2017 年提出,而且经过了多次优化更新。使用这种技术可以更简便地创造神经网络。由此产生的架构使用了移动倒置瓶颈卷积(MBConv),类似于 MobileNetV2 和 MnasNet 模型,但由于计算力(FLOPS)预算增加,MBConv 模型体积略大。随后他们多次缩放了基线网络,组成了一系列模型,统称为 EfficientNets。
EfficientNet 的主要特点包括:
复合缩放: EfficientNet 在不同的网络维度(深度、宽度、分辨率)上进行统一的缩放,以获得更好的性能。深度可扩展: 通过增加网络深度,可以捕获更丰富的特征表达。宽度可扩展: 增加网络通道数可以提升网络的特征表示能力。分辨率可扩展: 使用不同分辨率的输入图像可以适应不同任务和需求。复合缩放参数: 通过复合缩放参数来平衡深度、宽度和分辨率的权衡。1.2EfficientNet 性能分析
为了测试其性能,研究人员与 ImageNet 上的其他现有 CNN 进行了比较。结果显示,EfficientNet 在大多数情况下表现亮眼,比现有 CNN 的准确率和效率都高,还将参数大小和计算力降低了一个数量级。
比如 EfficientNet-B7 在 ImageNet 上达到的 Top-1 最高准确率是 84.4%,Top-5 准确率是 97.1%。在 CPU 推理上,它的体积比最好的 CNN 模型 GPipe 小 8.4 倍,但速度快了 6.1 倍。与广泛使用的 ResNet-50 相比,EfficientNet-B4 使用了类似的计算力,但 Top-1 准确率从 76.3% 提升到了 82.6%。此外,EfficientNets 不仅在 ImageNet 上表现出众,其能力还可以转移到其它数据集上。他们在 8 个流行的迁移学习数据集上测试了 EfficientNets。结果显示,它在其中的 5 个上面都拿到了顶尖成绩,例如在 CIFAR-100 上获得了 91.7% 的成绩,在 Flowers 上获得了 98.8% 的成绩,而且参数至少减少了一个数量级,甚至还可以最多减少 21 倍,说明 EfficientNets 具有很强的迁移能力。
1.3EfficientNet的基本原理公式
卷积层i可以通过公式 , 代表卷积操作, 表示输出张量, 表示输入张量。<Hi,Wi,Ci>表示输入张量的形状,Hi,Wi是feature map的尺寸,Ci 是feature map的输入通道数。卷积N可以用一系列组成层表示:
N是分类网络,X表示输入,Fi 是基础网络层,Li 表示在第i个stage中基础网络层Fi 的重复次数,总共有s个stage。其空间维度,即feature map的尺寸逐层递减,但是通道维度是逐渐增加的。
不像规则的ConvNets设计,大多聚焦于发现最好的基础网络层Fi,然后再利用模型缩放在不改变预先在baseline网络定义好的Fi 的前提下扩展网络深度Li 、宽度Ci 、分辨率<Li, Ci,Hi,Wi> 为了更进一步减小设计空间,我们限制所有层都统一以一个常量比例缩放,我们的目标是在给定资源预算下最大化模型精度,可以定义为如下优化问题:
(3)
那么model scaling的目标就是在模型参数和计算量满足限制条件的情况下最大化网络的准确率,也就是公式2所表达的内容,待优化的参数就是网络深度(d)、网络宽度(w)和分辨率(r)。
深度(d):缩放网络深度在许多ConvNets都有使用,直觉上更深的网络可以捕获到更丰富和更复杂的特征,在新任务上也可以泛化的更好。然而,更深的网络由于梯度消失问题也更难训练。尽管有一些技术,例如跨层连接、批量归一化等可以有效减缓训练问题,但是深层网络的精度回报减弱了。
宽度(w):缩放网络宽度也是一种常用的手段,正如之前讨论过的,更宽的网络可以捕捉到更细粒度的特征从而易于训练。然而,非常宽而又很浅的网络在捕捉高层次特征时有困难。
Resolution(r):使用更高分辨率的输入图像,ConvNets可能可以捕捉到更细粒度的模式。从最早的 224x224,现在有些ConvNets为了获得更高的精度选择使用 229x229 或者 331x331。目前,GPipe使用 480x480 的分辨率获得了最先进的ImageNet精度,更好的精度比如 600x600 也被广泛使用在目标检测网络中。
之前的一些工作已经开始在追去任意缩放网络深度和宽度,但是他们仍然需要复杂的人工微调。在本篇论文中,我们提出了一个新的复合缩放方法——使用一个复合系数ϕ统一缩放网络宽度、深度和分辨率:
(4)
这里的α,β,γ都是由一个很小范围的网络搜索得到的常量,直观上来讲,ϕ是一个特定的系数,可以控制用于资源的使用量,α,β,γ决定了具体是如何分配资源的。值得注意的是,常规卷积op的计算量是和d,w2,r2 成正比的,加倍深度会使得FLOPS加倍,但是加倍宽度和分辨率会使得FLOPS加4倍。由于卷积ops经常在CNN中占据了大部分计算量,使用等式(3)缩放ConvNet将会使得整体计算量近似增加(α⋅β2⋅γ2)ϕ 倍。在本篇论文中,我们对任意ϕ增加了约束α⋅β2⋅γ2≈2,整体的计算量近似增加了2ϕ倍。
1.4MATLAB开发方法
% 导入深度学习工具箱addpath(genpath('path_to_your_matlab_deep_learning_toolbox'));% 加载预训练的 EfficientNet-B0 模型net = efficientnetb0;% 指定输入图像尺寸inputSize = [224 224 3]; % 根据模型的输入尺寸进行设置% 创建图像数据存储器imds = imageDatastore('path_to_your_image_folder', ... 'IncludeSubfolders', true, 'LabelSource', 'foldernames');% 数据预处理augmentedImds = augmentedImageDatastore(inputSize(1:2), imds);% 迁移学习训练options = trainingOptions('sgdm', ... 'MiniBatchSize', 16, ... 'MaxEpochs', 10, ... 'InitialLearnRate', 1e-3, ... 'Shuffle', 'every-epoch', ... 'ValidationData', augmentedImds, ... 'ValidationFrequency', 50, ... 'Verbose', true, ... 'Plots', 'training-progress');% Fine-tune 模型net = trainNetwork(augmentedImds, net, options);