图像分类的迁移学习

把 VGG16 看图的本领,迁移到自己的叶片分类任务。

此刻

怎么做

会骗你

文字版:图像分类的迁移学习在做什么

自己手上只有几百张图片,从零训练一个网络几乎不可能。迁移学习的做法是:借一个已经在海量图片上学会「怎么看图」的模型,把它最后那几层换成自己的类别,只训练新接上去的部分。这一页以番茄叶片病害分类为例,把拆装过程一步步演示出来。

画面上正在发生什么

先认识原模型:VGG16 在 ImageNet 上预训练过,前面的卷积层负责提取图像特征,后面 4096→4096→1000 的全连接层负责把特征组合成 ImageNet 那 1000 个类别的得分。要换掉的只是最后这部分——1000 个类里没有「番茄早疫病」,但「怎么看出叶子上有斑点」这个本领是通用的。

接下来三步是关键:拆下旧分类器(紫色那几层整体移走),接上自己的分类层(绿色,输出维度等于你的类别数),然后冻结前面的卷积层,只训练新层。最后一步是微调:解冻最后一组卷积,用很小的学习率继续训练,让特征提取器也稍微适应你这批图像的特点。

什么时候它会骗你

  • 一上来就微调整个网络,小数据会被带偏。标准顺序是先冻结全部卷积层只训新分类头,等新层稳定了再解冻最后一两组卷积、用小十倍的学习率微调。一开始就全放开,随机初始化的新层会产生很大的梯度,把预训练学到的特征冲毁。
  • 源领域和目标领域差太远时,迁移不一定有用。ImageNet 是自然照片。迁移到叶片、细胞切片这类图像通常仍然有效(底层的边缘纹理是通用的),但迁移到 X 光片、遥感图、频谱图时收益会明显下降,有时还不如在领域内数据上从头训练一个小模型。
  • 预处理必须和预训练时保持一致。输入尺寸、通道顺序、归一化用的均值和标准差都要沿用原模型的设定。这一步弄错不会报错,只会让准确率莫名其妙地上不去——这是迁移学习里最常见的隐性错误。

常见问题

冻结和微调分别指什么?
冻结是把某些层的参数固定住不参与更新,训练时它们只做前向计算;微调是解冻部分层、用较小的学习率让它们跟着一起更新。常见流程是先冻结全部卷积训练新分类头,再解冻最后一两组卷积微调。
数据很少时该冻结多少层?
经验规则是:数据越少、和预训练领域越接近,就冻结越多。几百张图且领域接近时,通常只训练新分类头;几千张图可以解冻最后一组卷积;上万张且领域差异大时才考虑放开更多层。
迁移学习需要多少张图?
没有硬门槛。每类几十张就能开始做出有意义的结果,每类几百张通常已经不错。比数量更要紧的是:各类之间数量别差太多、验证集要独立(同一株植物、同一个病人的图不能跨集)、图像采集条件要覆盖实际使用时会遇到的变化。

本页为结构教学动画,未载入 VGG16 权重、未运行实际训练;叶片图像为程序绘制的示意,页面不输出准确率或预测概率。

作者与维护:覃秉丰 · 关于覃秉丰 · 引用本页讲解

继续学习