计算机视觉的快速发展 —— 图像分类用例已经由迁移学习的出现进一步加速。在大型图像数据集上训练计算机视觉神经网络模型需要大量的计算资源和时间。
幸运的是,可以通过使用预训练模型来缩短这段时间和资源。从预训练模型中利用特征表示的技术称为迁移学习。预训练模型通常是使用高端计算资源和大规模数据集进行训练。
预训练模型可以以多种方式使用:
- 使用预训练权重直接对测试数据进行预测
- 使用预训练权重进行初始化,并使用自定义数据集对模型进行训练
- 仅使用预训练网络的架构,并从头开始在自定义数据集上进行训练
本文介绍了前十个最先进的预训练模型,用于获取图像嵌入。所有这些预训练模型都可以使用keras.application API加载为keras模型。
1)VGG:
VGG-16/19网络是在2014年ILSVRC会议上推出的,因为它是最受欢迎的预训练模型之一。它由牛津大学的视觉图形组开发。
VGG模型有两个变种:16层和19层网络,VGG-19(19层网络)是VGG-16(16层网络)模型的改进。
架构:
(来源,自由使用许可下的CC BY-SA 4.0),VGG-16网络架构
VGG网络在结构上简单且连续,使用了大量的滤波器。在每个阶段,使用小的(3*3)滤波器来减少参数数量。
VGG-16网络具有以下特点:
- 卷积层 = 13
- 池化层 = 5
- 全连接层 = 3
输入:尺寸为(224, 224, 3)的图像
输出:1000维图像嵌入
VGG-16/19的其他细节:
- 论文链接:https://arxiv.org/pdf/1409.1556.pdf
- GitHub:VGG
- 发布日期:2015年4月
- 在ImageNet数据集上的性能:71%(前1精度),90%(前5精度)
- 参数数量:约140M
- 层数:16/19
- 磁盘大小:约530MB
实现:
- 对输入数据调用
tf.keras.applications.vgg16.preprocess_input
,将输入图像转换为零中心的BGR格式。 - 使用以下代码实例化VGG16模型:
tf.keras.applications.VGG16( include_top=True, weights="imagenet", input_tensor=None, input_shape=None, pooling=None, classes=1000, classifier_activation="softmax",)
上述代码用于VGG-16实现,keras还提供了类似的API用于VGG-19的实现,请参考此文档获取更多详细信息。
2) Xception:
Xception是一个深度CNN架构,它涉及逐深度可分离卷积。逐深度可分离卷积可以理解为具有最大数量塔的Inception模型。
架构:
(来源,基于CC BY-SA 4.0的免费使用许可证),Xception架构
输入:尺寸为(299, 299, 3)的图像
输出:1000维图像嵌入
Xception的其他细节:
- 论文链接:https://arxiv.org/pdf/1409.1556.pdf
- GitHub:Xception
- 发表时间:2017年4月
- 在ImageNet数据集上的表现:79%(Top 1准确率),94.5%(Top 5准确率)
- 参数数量:~30M
- 深度:81
- 磁盘大小:88MB
实施:
- 使用下面的代码实例化Xception模型:
tf.keras.applications.Xception( include_top=True, weights="imagenet", input_tensor=None, input_shape=None, pooling=None, classes=1000, classifier_activation="softmax",)
上述代码是Xception实施的代码,更多详情请参阅 此文档。
3) ResNet:
之前的CNN架构设计不能扩展到多个卷积层。这导致梯度消失问题,并且在现有架构中添加新层时性能受限。
ResNet架构通过跳跃连接来解决梯度消失问题。
架构:
(来源,基于CC BY-SA 4.0的免费使用许可证),ResNet架构
这个ResNet模型使用了一个34层网络架构,受到了VGG-19模型的启发,其中添加了快捷连接。这些快捷连接将架构转换为残差网络。
ResNet架构有几个版本:
- ResNet50
- ResNet50V2
- ResNet101
- ResNet101V2
- ResNet152
- ResNet152V2
输入:尺寸为(224, 224, 3)的图像
输出:1000维图像嵌入
ResNet模型的其他细节:
- 论文链接:https://arxiv.org/pdf/1512.03385.pdf
- GitHub:ResNet
- 发表时间:2015年12月
- 在ImageNet数据集上的表现:75-78%(Top 1准确率),92-93%(Top 5准确率)
- 参数数量:25-60M
- 深度:107-307
- 磁盘大小:~100-230MB
实施:
- 使用下面的代码实例化ResNet50模型:
tf.keras.applications.ResNet50( include_top=True, weights="imagenet", input_tensor=None, input_shape=None, pooling=None, classes=1000, **kwargs)
上述代码是ResNet50实现的代码,keras还提供了类似的API用于其他ResNet架构的实现,详情请参考此文档。
4)Inception:
多个深层卷积导致数据的过拟合。为了避免过拟合,Inception模型在同一层级上使用平行层或多个不同大小的滤波器,使模型变宽而不是变深。Inception V1模型由4个平行层组成,包括:(1*1)、(3*3)和(5*5)的卷积,以及(3*3)的最大池化。
Inception(V1/V2/V3)是由Google团队开发的基于深度学习模型的CNN网络。InceptionV3是InceptionV1和V2模型的先进和优化版本。
架构:
InceptionV3模型由42个层组成。InceptionV3的架构逐步按以下步骤建立:
- 分解卷积
- 较小的卷积
- 不对称卷积
- 辅助卷积
- 网格大小减小
所有这些概念都结合在下面的最终架构中:
(来源,根据CC BY-SA 4.0自由使用许可证),InceptionV3架构
输入:尺寸为(299, 299, 3)的图像
输出:1000维的图像嵌入
InceptionV3模型的其他细节:
- 论文链接:https://arxiv.org/pdf/1512.00567.pdf
- GitHub:InceptionV3
- 发表时间:2015年12月
- 在ImageNet数据集上的性能:78%(前1准确率),94%(前5准确率)
- 参数数量:2400万
- 深度:189
- 磁盘大小:92MB
实施:
- 使用下面的代码实例化InceptionV3模型:
tf.keras.applications.InceptionV3( include_top=True, weights="imagenet", input_tensor=None, input_shape=None, pooling=None, classes=1000, classifier_activation="softmax",)
上述代码是InceptionV3的实现代码,详情请参考此文档。
5)InceptionResNet:
InceptionResNet-v2是由Google的研究人员开发的CNN模型。该模型的目标是减少InceptionV3的复杂性,并探索在Inception模型上使用残差网络的可能性。
架构:
(来源,使用CC BY-SA 4.0的免费许可证),Inception-ResNet-V2 架构
输入:尺寸为(299,299,3)的图像
输出:1000维图像嵌入
Inception-ResNet-V2 模型的其他细节:
- 论文链接:https://arxiv.org/pdf/1602.07261.pdf
- GitHub:Inception-ResNet-V2
- 发布日期:2016年8月
- 在 ImageNet 数据集上的表现:80%(前1个准确率),95%(前5个准确率)
- 参数数量:5600万
- 深度:189
- 磁盘大小:215MB
实现:
- 使用下面的代码实例化 Inception-ResNet-V2 模型:
tf.keras.applications.InceptionResNetV2( include_top=True, weights="imagenet", input_tensor=None, input_shape=None, pooling=None, classes=1000, classifier_activation="softmax", **kwargs)
上述代码是 Inception-ResNet-V2 实现的代码,获取更多详情请参考此文档。
6) MobileNet:
MobileNet 是一种简化的架构,使用深度可分离卷积构建深度卷积神经网络,并为移动和嵌入式视觉应用提供了高效模型。
架构:
(来源,使用CC BY-SA 4.0的免费许可证),MobileNet 架构
输入:尺寸为(224,224,3)的图像
输出:1000维图像嵌入
MobileNet 模型的其他细节:
- 论文链接:https://arxiv.org/pdf/1602.07261.pdf
- GitHub:MobileNet-V3,MobileNet-V2
- 发布日期:2017年4月
- 在 ImageNet 数据集上的表现:71%(前1个准确率),90%(前5个准确率)
- 参数数量:350-430万
- 深度:55-105
- 磁盘大小:14-16MB
实现:
- 使用下面的代码实例化 MobileNet 模型:
tf.keras.applications.MobileNet( input_shape=None, alpha=1.0, depth_multiplier=1, dropout=0.001, include_top=True, weights="imagenet", input_tensor=None, pooling=None, classes=1000, classifier_activation="softmax", **kwargs)
上述代码是用于MobileNet实现,keras提供了与其他MobileNet架构(MobileNet-V2、MobileNet-V3)实现类似的API,更多细节请参考此文档。
7)DenseNet:
DenseNet是一种CNN模型,旨在改善由于高级神经网络中输入层和输出层之间距离过大导致的梯度消失而引起的准确性问题,信息在到达目标之前消失。
架构:
DenseNet架构有3个密集块。相邻块之间的层称为过渡层,通过卷积和池化改变特征图大小。
(来源,基于 CC BY-SA 4.0的免费使用许可),DenseNet架构
输入:尺寸为(224, 224, 3)的图像
输出:1000维图像嵌入
DenseNet模型的其他细节:
- 论文链接:https://arxiv.org/pdf/1608.06993.pdf
- GitHub:DenseNet-169,DenseNet-201,DenseNet-264
- 发表于:2018年1月
- 在ImageNet数据集上的性能:75-77%(Top 1准确率),92-94%(Top 5准确率)
- 参数数量:8-20M
- 深度:240-400
- 磁盘大小:33-80MB
实现:
- 使用以下代码实例化DenseNet121模型:
tf.keras.applications.DenseNet121( include_top=True, weights="imagenet", input_tensor=None, input_shape=None, pooling=None, classes=1000, classifier_activation="softmax",)
上述代码是用于DenseNet实现,keras提供了与其他DenseNet架构(DenseNet-169、DenseNet-201)实现类似的API,更多细节请参考此文档。
8)NasNet:
谷歌研究人员设计了一个NasNet模型,将寻找最佳CNN架构的问题作为一种强化学习方法。其思想是在给定搜索空间中搜索一组最佳参数,包括层数、滤波器大小、步幅、输出通道等。
输入:尺寸为(331, 331, 3)的图像
NasNet模型的其他细节:
- 论文链接:https://arxiv.org/pdf/1608.06993.pdf
- 发表于:2018年4月
- 在ImageNet数据集上的性能:75-83%(Top 1准确率),92-96%(Top 5准确率)
- 参数数量:5-90M
- 深度:389-533
- 磁盘大小:23-343MB
实现:
- 使用以下代码实例化NesNetLarge模型:
tf.keras.applications.NASNetLarge(input_shape = None,include_top = True,weights =“imagenet”,input_tensor = None,pooling = None,classes = 1000,classifier_activation =“softmax”),
上述代码是用于NesNet实现的,keras还提供了类似的API用于其他NasNet架构(NasNetLarge,NasNetMobile)的实现,了解更多详情请参考此文档。
9) EfficientNet:
EfficientNet是来自Google研究员的CNN架构,可以通过称为复合缩放的方法实现更好的性能。该缩放方法通过固定金额(复合系数)统一缩放深度/宽度/分辨率的所有维度。
架构:
(来源,根据CC BY-SA 4.0自由使用许可证),Efficient-B0架构
EfficientNet模型的其他详细信息:
- 论文链接:https://arxiv.org/pdf/1905.11946v5.pdf
- GitHub:EfficientNet
- 发布日期:2020年9月
- 在ImageNet数据集上的性能:77-84%(Top 1准确性),93-97%(Top 5准确性)
- 参数数目:5-67M
- 深度:132-438
- 磁盘上的大小:29-256MB
实现:
- 使用下面的代码实例化EfficientNet-B0模型:
tf.keras.applications.EfficientNetB0(include_top = True,weights =“imagenet”,input_tensor = None,input_shape = None,pooling = None,classes = 1000,classifier_activation = “softmax”,**kwargs)
上述代码是用于EfficientNet-B0实现的,keras还提供了类似的API用于其他EfficientNet架构(EfficientNet-B0至B7,EfficientNet-V2-B0至B3)的实现,了解更多详情请参考此文档和此文档。
10) ConvNeXt:
ConvNeXt CNN模型是一种纯卷积模型(ConvNet),灵感来自于Vision Transformers的设计,声称胜过它们。
架构:
(来源,根据CC BY-SA 4.0自由使用许可证),ConvNeXt架构
ConvNeXt模型的其他详细信息:
- 论文链接:https://arxiv.org/pdf/1905.11946v5.pdf
- GitHub:ConvNeXt
- 发布日期:2022年3月
- 在ImageNet数据集上的性能:81-87%(Top 1准确性)
- 参数数目:29-350M
- 磁盘上的大小:110-1310MB
实施:
- 使用下面的代码实例化ConvNeXt-Tiny模型:
tf.keras.applications.ConvNeXtTiny( model_name="convnext_tiny", include_top=True, include_preprocessing=True, weights="imagenet", input_tensor=None, input_shape=None, pooling=None, classes=1000, classifier_activation="softmax",)
上述代码是ConvNeXt-Tiny的实现,keras还提供了其他EfficientNet架构(ConvNeXt-Small,ConvNeXt-Base,ConvNeXt-Large,ConvNeXt-XLarge)实现的类似API,详细信息请参考此文档。
摘要:
我讨论了10种流行的CNN架构,可以使用迁移学习生成嵌入。这些预训练的CNN模型在ImageNet数据集上表现优异。Keras库提供了加载讨论过的预训练模型的架构和权重的API。从这些模型生成的图像嵌入可以用于各种用途。
然而,这是一个不断发展的领域,总是有新的CNN架构值得期待。
原文由Suraj Gurav在此发布。