1.简介
一些文献中提到训练好的VGG模型底层部分可以用于提取图片特征,而且可以有很好的效果。因此,就有了一种懒办法来训练模型了:使用VGG提取特征,然后用这些特征用于分类。这里以一个颜值分类的任务为例,数据集的地址为:http://www.hcii-lab.net/data/SCUT-FBP/CN/introduce.html 。整个数据集只有500多个图片,颜值的分数从1到5。如果从头开始训练一个CNN模型的话,那么就很容易过拟合。而迁移学习的方式使用ImageNet大量的图片数据训练的卷积模板用于提取特征,可以减少训练的参数数量。
2.模型
我们将图片crop到大小244x244x3,底层部分是VGG模型,产生9x9x512的特征。然后使用GlobalAveragePooling一斤GlobalMaxPooling分别得到512维的特征,再拼接成1024维的特征。接着使用一个全连接层将特征映射为64维,再使用softmax得到分类结果。我们这里测试了2分类、5分类的两种情况。
对比模型采用另一个CNN模型,模型的结构为:
层 | 结构:(fliters, kerner_size/pool size, strides) |
1 | Conv2D 50,11,(4,4) |
2 | MaxPooling (2,2),(2,2) |
3 | Conv2D 100,5,(1,1) |
4 | MaxPooling (2,2),(2,2) |
5 | GlobalAveragePooling |
6 | Dense(64) |
7 | BatchNormalization |
8 | Dense(softmax) |
3.结果
使用50张图片用于验证,发现迁移学习可以轻松超过从头开始训练的模型。
类别个数 | 对比模型 | 迁移学习 |
2 | 0.80 | 0.84 |
5 | 0.68 | 0.72 |
另外再找几张图片测试一下:
图片 | 对比模型 | 迁移学习 |
2 | 5 | |
2 | 5 | |
2 | 1 | |
2 | 5 |
看来对比模型根本就不行啊,亏我还试了大量的优化器参数。orz
而迁移模型的方法真是省时省力。
调参经验:(1)加入BatchNormalization和Dropout都有一定的效果,但是Dropout会让训练集和测试集上的准确率都较低。(2)使用Adam容易训练太快,迅速过拟合。可以使用SGD慢慢调试学习率。(3)可以考虑加一点L1或者L2正则。
代码在这里