浅谈迁移学习图像分类

Coursera创始人斯坦福大学副教授吴恩达声称,迁移学习将成为机器学习取得商业成功的下一个驱动力。

迁移学习是一种机器学习技术,在一个特定的数据集上重新利用已经训练过的卷积神经网络(CNN),并将其改造或迁移到一个不同的数据集中。重复使用训练过的卷积神经网络,主要原因是训练数据通常需要花费很长的时间。例如:在4个NVIDIA K80 GPU上对ResNet18训练30次需要3天,在4个NVIDIA K80 GPU上对ResNet152训练120次需要4个月。

本文将使用pytorch在不同的数据集上进行迁移学习,阐述最常见的迁移学习策略,并分析何种情况应该使用哪种策略

如果想直接看到结果,请划至文末。

迁移学习策略

通常来说,迁移学习的策略有两种。Finetuning(微调)包括在基数据集上使用预训练网络,并目标数据集上训练所有层。Freeze and Train(冻结和训练)包括仅冻结并训练最后一层,其他层不变(权重不更新)也可以冻结前几层,微调其他层,这由于有些证据表明CNN的前几纹理滤镜和彩色斑点本文我们将分析两个极端的例子:训练所有的网络层和只训练最后一层

最常见的基数据集是 ImageNet,包含1000个类别的120万张图像,每个类别的图像大约有1000张,可分为两:动物和物品。大多数深度学习库提供在ImageNet上训练好的CNN模型。

下图为CNN架构的工作流程图,即ResNet,来识别猫。输入为一张224px*224px大小3通道RGB图像,输出是虎斑猫标签。最后一层有1000个单元,相当于1000个ImageNet类。

e7a678dbc9648f1feac80847d8e02273a4da26aa 

下图可看到上述提到的迁移学习的两个方法。在这里,我们在ImageNet上使用一个预先训练过的CNN,改编来对Homer Simpson分类,将 the Simpsons Character Data的一个子集作为目标数据集。这个子集包含20个类,每个类有300到1000个图像。

迁移学习的第一步是将基本数据集类的数量调整到目标数据集类的数量,在Simpson数据集中,必须删除网络最后一层,包含1000个单元,并添加了一个20个单元的新层。

如上图所示然后进行Freeze and Train(冻结和训练),我们只训练最后一层。或者我们也可以微调所有层,如下图所示。

85880d33e1550cbb4ebd4562239bd5639eb08621 

什么时候使用迁移学习?

应该只训练最后一层还是微调整个网络适用于哪种情况很难确定。在Yosinsky的论文(Yosinsky 等等, 2014)中,作者表述了在ImageNet数据集的环境一个指定的卷积神经网络层是常规的还是特定的这一量化程度问题。由于这些层需要相互适应在中间的某些层网络的分裂对迁移负面影响。论文指出,迁移间隔随着任务之间距离的增加而增长,零权重训练相比,用迁移权重初始化网络可以提高范化性能。

正如Karpathy教程中所讲的,在新的数据集中使用迁移学习时,一些基本原则如下:

1.小而相似的图像:当目标数据集与基本数据集相比较小,且图像相似时,建议冻结和训练最后一层。

2.大而相似的图像:当数据集大且图像相似时,建议微调。

3.小而不同的图像:建议freeze and train(冻结和训练最后一层,或一些最后一层。

4.大而不同的图像:建议微调。

本文将使用不同的数据集重新验证这些策略。

1318c6c34a0e7c6f3c416e6f71dc151accde56bf 

模型和实用程序

第一步,定义finetune (微调)和freeze_and_train(冻结和训练)程序。此外,列出了pytorch中所有可用模型,我们可以将其用作基础模型。

1318c6c34a0e7c6f3c416e6f71dc151accde56bf 

4a3c8741662bf56d0980f50381f9b83a85d9e35f 

数据集

我们使用不同的数据集测试迁移学习程序,将它们全部转换为灰度范围内的数据集,来分析网络在彩色空间内的行为。我们还必须按照pytorch结构将数据集目录分为训练和验证。所有的步骤请参照data_prep.ipynb

资源链接:

Hymenoptera2 个类和397 张图片

Simpons20 个类(总体的子集) 和19548张图像

Dogs vs Cats2个类和25000 张图像

Caltech 256257个类和 30607张图像

9bbaf06b86b807b0f649ad3702975075c5f7f322

    我们定义了初始化参数。

019252bd4d7a0167d1ab188ee6fcd3f5710f9c5e 

现在,我们加载每个数据集,显示每个数据集的内部统计信息。

a58857a94a4a27e897fd70c231adca78eeb86555 

bebf64700843b9178daf18bf681dc4309cca4060 

81736bcbb27db102ce81e2108c8e4caa95d6e4b9 

ccb9e21f27c21b8f0804ad94ae5a460930f08b54 

353e3ab76130283d599563d0dd90d859c9de9b16

训练

对于每个数据集,我们将要计算 finetunining和freeze and train。

注:截止到目前(2017年12月),PyTorch并行计算的效率并不高,因此同时使用4个GPU计算微调和冻结。使用一个GPU冻结的速度比微调快2.5倍。它们有个PR解决这个问题,更多信息请参阅这里

Hymenoptera数据集

206b7160d867ba19e8adc7743feef357979615b5

44ab0167a9ef8691fd2ac812b43c8951020e0377 

0ffe8a1a3f6cecbcbf8bc23696b00d87c571bbca 

b5d8e0267a22c43bae38528a7fd92cc5cc06a17a 

Simpsons数据集

da72d5356d088ec09e525992b08633f34ab06b8c 

09ffa68ea6676e8a00b3aed28c5b811a396e8e4123596c1605bed9e399165f0ee166d8a5a85b7934315ad9fa3d47180879c916e1159dc62e7fdc51d0 

Dogs vs cats数据集

a6d1998943a03740b894bf9cb58a1d76d409567c7ed0486345bd4d99821896bcc9e932d772eef2c097b1ba0d7a45e1b31e7806ac8d1bcec96b543cdbaccd401d9970e5f183f264999b2573533363f672 

Caltech256数据集

bb2c13045f7138e1df432de5c05eecafadfe3b8a28969968f91b742a4739757423d4180ac255354a87b90b3b8c78fb83d84c12f469fabf24b0aa4183fcd37ca47bb8e3548348f59a9a506776b4d23096 

总结

c7afdea3ffd3742dafa196f6311018cbbd5c5868 

讨论和分析

本文使用了数量有限的小型网络数据集ResNet18,因此将研究成果推广到所有数据集和网络还为时过早。然而,这一研究成果可能会使用转移学习时碰到的问题提供一些启示。结论如下表所示。

0ab10dc88f8abe89315f6792fbffed9aed0051ac 

我们观察到的第一个细节是,与彩色数据集相比,训练灰度数据集精确度低。这与其他研究人员的结论一致,即基数据集和目标数据集的领域差异越大,移植性越差。

我们也观察到,对于Simpsons和Caltech256数据集来说,在冻结时精确度降低幅度较大。在Simpsons数据集中,精确度降低多可能是由于领域跨度大,而在ImageNet数据集中有自然图像,Simpsons数据集中大多是纯色。在Caltech数据集中精确度较低,冻结时精确度降低幅度较大。可能是由于一个包含了大量类数据集,每个类的图像数量小,大约数百个。

Dogs and Cats数据集ImageNet数据集最为相似,实际上,ImageNet数据集包含几种狗和猫。在这种情况下,微调或冻结没有太大的差别。

    最后,在hymenoptera(膜翅目昆虫)数据集中,我们看见了在冻结时彩色数据集的一个小进步。这是因为领域相近,并且数据集比较小的缘故。对应灰色数据集,在冻结的时候,我们看不到任何提高,大概是由于领域迥异吧。

 

以上为译文。

本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。

文章原标题《A Gentle Introduction to Transfer Learning for Image Classification,译者:Mags,审校:袁虎。

文章为简译,更为详细的内容,请查看原文

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个流行的深度学习框架,用于图像分类迁移学习在PyTorch中非常常见,以下是基础知识概览: 1. **预加载模型**:首先,你需要导入PyTorch的`torchvision.models`模块,可以加载预训练的模型,如`resnet18`, `vgg16`, `densenet121`等。它们通常在ImageNet数据集上经过训练,能提供强大的特征提取能力。 ```python model = torchvision.models.resnet18(pretrained=True) ``` 2. **冻结模型**:如果你只想用预训练模型提取特征而不做微调,可以将模型的参数设置为不可训练(`requires_grad=False`)。这样可以节省计算资源,并防止改变基础特征。 ```python for param in model.parameters(): param.requires_grad = False ``` 3. **替换头部**:为了针对新的图像分类任务,你需要替换掉模型顶部的部分(通常是最后的全连接层),这部分被称为“头”或“分类层”。新建一个适合新任务的线性层并设置其参数为可训练。 ```python num_classes = len(new_dataset.classes) # 新的数据集类别数量 new_classifier = nn.Linear(model.fc.in_features, num_classes) model.fc = new_classifier ``` 4. **加载数据和训练**:创建DataLoader处理图像数据,然后开始微调过程。使用`optimizer`(如SGD、Adam等)更新新分类层的参数,而不是整个模型。 ```python train_loader, val_loader = create_data_loaders() # 自定义数据加载函数 optimizer = torch.optim.SGD(model.fc.parameters(), lr=0.001) for epoch in range(num_epochs): train(...) validate(...) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值