尝试了将前面层的lr调成0,只训练全连接层,结果放在了每个微调网络的最后;
另外添加了50层的ResNet进行fine-tuning,结果得到了进一步的提高,超越了SVM在这一数据集上的最佳performance(87%)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Deep Learning或者说CNN在图像识别这一领域取得了巨大的进步,那么自然我们就想将CNN应用到我们自己的数据集上,但这时通常就会面临一个问题:通常我们的dataset都不会特别大,一般不会超过1万张,甚至更少,每一类图片只有几十或者十几张。这时候,直接应用这些数据训练一个网络的想法就不可行了,因为深度学习成功的一个关键性因素就是大量带标签数据组成的训练集。如果只利用手头上这点数据,即使我们利用非常好的网络结构,也达不到很高的performance。这时候,fine-tuning的思想就可以很好解决我们的问题:我们通过对ImageNet上训练出来的模型(如CaffeNet,VGGNet,ResNet)进行微调,然后应用到我们自己的数据集上。
由于ImageNet数以百万计带标签的训练集数据,使得如CaffeNet之类的预训练的模型具有非常强大的泛化能力,这些预训练的模型的中间层包含非常多一般性的视觉元素,我们只需要对他的后几层进行微调,在应用到我们的数据上,通常就可以得到非常好的结果。最重要的是,在目标任务上达到很高performance所需要的数据的量相对很少
这是Caffe官方提供的fine-tuing示例:Caffe | Fine-tuning for style recognition
下面我们看另外一个有趣的例子:
Oxford flowers分类
CaffeNet fine-tuned for Oxford flowers dataset
我修改了他们的一些代码,使用了VGG_16而不是VGG_S模型,得到了更好的结果。
这是一个给花分类的例子,我们首先
git clone https://github.com/fish145/fine-tuning
cd Oxford102
克隆整个项目到本地,然后使用
python bootstrap.py
准备图片,并下载CaffeNet和VGG-16这两个预训练模型