使用迁移学习进行颜值分类

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正则。
代码在这里

发表评论