使用迁移学习完成图像的多标签分类任务

本文通过迁移学习将预训练好的VGG16模型应用到图像的多标签(Multi-Label)分类问题中。该项目数据来自于Kaggle,每张图片可同时属于多个标签。模型的准确度使用F_{\beta} \text{ score}进行量化,如下表所示:

标签预测为Positive (1)预测为Negative (0)
真值为Positive (1)TPFN
真值为Negative (0)FPTN

例如假设真实标签是(1,0,1,1,0,0),预测标签是(1,1,0,1,1,0),则TP=2, FN=1, FP=2, TN=1Precision=\frac{TP}{TP+FP},\text{  }Recall=\frac{TP}{TP+FN},\text{  }F_{\beta}=\frac{(1+\beta^2)*Presicion*Recall}{Recall+\beta^2*Precision}其中\beta越小,F_{\beta} \text{ score}中Precision的权重越大,\beta等于0F_{\beta} \text{ score}就变为Precision;\beta越大,F_{\beta} \text{ score}中Recall的权重越大,\beta趋于无穷大时F_{\beta} \text{ score}就变为Recall。可以在Keras中自定义该函数(y_pred表示预测概率):

此外在损失函数的使用上多标签分类和多类别(multi-class)分类也有区别,多标签分类使用\text{binary crossentropy loss},假设一个样本的真实标签是(1,0,1,1,0,0),预测概率是(0.2, 0.3, 0.4, 0.7, 0.9, 0.2)\text{binary crossentropy loss}=-(\ln 0.2 + \ln 0.7 + \ln 0.4 + \ln 0.7 + \ln 0.1 + \ln 0.8)/6=0.96另外多标签分类输出层的激活函数应选择sigmoid而非softmax。模型架构如下所示:

1.Kaggle网站上下载数据并解压,将其处理成可被模型读取的数据格式:

点击查看代码

2. 建立两个辅助函数,第一个函数用来分割训练集和验证集,第二个函数用来画出模型在训练过程中的学习曲线:

3. 使用Data Augmentation增加样本并对模型进行训练:

蓝线代表训练集,黄线代表验证集

Leave a Comment

Your email address will not be published. Required fields are marked *