多标签分类及其 caffe 实现总结

转载 2018年04月16日 09:44:40

一直对多标签分类(multi-label)“情有独钟”,因为一直感觉没有完全弄懂它。最近看博客看多了,看着看着突然有点感觉,所以就把目前的理解整理一下写下来。
目前我看到的多标签分类任务有下面的两种情况(如有错误,欢迎交流指正):

  1. 每个样本对应多个label,label的值非0即1,最后的损失函数使用SigmoidCrossEntropyLoss,比如:

    fig1.jpg 0 0 1      
    fig2.jpg 1 0 1      
    fig3.jpg 1 1 0  
    • 1
    • 2
    • 3

    caffe官网提供的Multi-label教程就是这种情况。在这种情况下,每一个label代表某一种属性的是与否。比如第一个标签可能表示图片中是否有人,第二个代表是否有狗等等。
    属于这一类型的例子有: link1link2

  2. 每个样本对应多个label,label可以有多于两个的取值,最后的损失函数使用多个SoftmaxWithLoss,比如:

    fig1.jpg 0 2 1      
    fig2.jpg 2 3 0      
    fig3.jpg 1 1 2      
    • 1
    • 2
    • 3

    在这种情况下,每一个label代表某一种属性的多种可能。比如第一个标签可能表示人的衣服是红色的、白色的还是蓝色的,第二个便签可能代表狗的颜色是白、黄、黑或者灰。
    属于这一类型的例子有: link3link4


上面是对多标签分类任务的一些认识,下面说一说用caffe具体的实现。
主要可以分为数据输入损失函数两个部分:

1 数据输入

因为caffe目前还没有明确给出制作多标签lmdb文件的功能,所以准备输入数据方面可以考虑下面的方法

  1. 使用HDF5存储方式制作输入数据。但是,当数据量大的时候,HDF5存储方式的硬盘消耗大,而且速度慢;
  2. 使用lmdb存储方式制作输入数据:
    1. data和label各存储在一个lmdb中。这一种修改的源码相对少一些,主要要修改的是生成lmdb文件对应的源码convert_imageset.cpp,可以参考上面提到的:link3link4
    2. data和label存储在同一个lmdb文件中。这一种方法需要修改的源码相对多一点。具体的可以参考上面提到的: link1
  3. 使用自己的python data layer直接读取图片和label。这一种也是caffe官网上给出的多标签分类教程( link5)使用的方法,可以参考上面提到的:link2

2 损失函数

  1. 使用SigmoidCrossEntropyLoss。只需要在最后的损失函数层使用这一损失函数即可(可以参考上面的 link1link2);
  2. 使用多个SoftmaxWithLoss。需要用Slice层将网络的label层进行分割,然后分别提供给不同的SoftmaxWithLoss层使用(可以参考上面的 link3link4 )。

可以根据实际需要选择损失函数,至于哪种比较有效,我也不是很清楚,如果知道的朋友欢迎留言分享。

使用caffe训练一个多标签分类/回归模型

前言这篇博客和上一篇性质差不多,都是旨在说明使用caffe训练图像分类模型的大概流程。不同的是,上篇博客讲的单标签图像分类问题,顾名思义,其输入和输出都是单标签或者可以说是单类别的,而此篇则把重点放在...
  • u010358677
  • u010358677
  • 2016-11-29 21:56:42
  • 2929

caffe多任务学习之多标签分类

最近在参加一个行人精细化识别的竞赛,项目里涉及了许多类别的分类,原本打算一个大的类别训练一个分类模型,但是这样会比较麻烦,对于同一图片的分类会重复计算分类网络中的卷积层,浪费计算时间和效率。后来发现现...
  • xjz18298268521
  • xjz18298268521
  • 2016-11-15 20:50:30
  • 10159

caffe 实现多标签输入(multilabel、multitask)

caffe 本身并不支持 多类标的输入, 该框架主要用于解决图片分类的问题,而目前,两个重要的问题需要多标签的输入:多任务学习(multi-task)和多标签分类(multi-label),本文针对这...
  • hubin232
  • hubin232
  • 2016-03-23 08:26:32
  • 19427

【caffe-Windows】基于Python多标签方法——VOC2012数据集

前言按照上一篇博客所遗留的话题:多标签分类,进行初步探索,此篇博客针对caffe官网的多分类进行配置,只不过是Python接口的,不过官网在开头说明可以使用HDF5或者LMDB进行操作,只不过Pyth...
  • zb1165048017
  • zb1165048017
  • 2017-06-22 10:14:46
  • 2021

caffe实现多标签输入(multilabel、multitask)

caffe里自带的convert_imageset.cpp直接生成一个data和label都集成在Datum的lmdb(Datum数据结构见最 后),只能集成一个label。而我们平时遇到的分类问题可...
  • u013010889
  • u013010889
  • 2016-11-09 12:00:47
  • 10333

caffe多标签训练

最近刚接触caffe弄了一个caffe多标签遇到各种蛋疼的问题跟大家分享分享。 一  准备数据这里用的验证码0-9+26个字母字母生成4位数的验证码 二  修改caffe源码涉及到修改的文件有  ...
  • u014199999
  • u014199999
  • 2017-03-02 10:12:28
  • 787

Caffe 实现多标签分类

最近在用Caffe做验证码识别时,发现没有用Tensorflow简单(tensorflow中可以用one-hot, 参考我的另一篇blog:  http://blog.csdn.net/sushiqi...
  • sushiqian
  • sushiqian
  • 2017-12-10 12:30:00
  • 166

Caffe实践 - 基于VGG16 多标签分类的训练与部署

基于Caffe VGG16 的多标签分类 这里采用从图像直接读取图片数据和标签的方式进行多标签分类....
  • oJiMoDeYe12345
  • oJiMoDeYe12345
  • 2017-08-25 17:12:43
  • 2037

修改caffe源码满足多标签输入--多标签lmdb

近期因项目需要,要完成一个多标签的回归任务,hdf5格式在图像预处理方面确实不方便,于是,看了网上几篇关于修改caffe源码使得输入多标签的,五花八门,一个是修改完之后影响了很多的模块的使用,编译出好...
  • wuzhiyang95_xiamen
  • wuzhiyang95_xiamen
  • 2016-12-08 16:20:59
  • 1158

Caffe 实现多标签分类 支持Multi-Label的LMDB数据格式输入

Caffe自带的图像转LMDB接口只支持单label,对于多label的任务,可以使用HDF5的格式,也可以通过修改caffe代码来实现, 我的文章Caffe 实现多标签分类 里介绍了怎么通过修改Im...
  • sushiqian
  • sushiqian
  • 2017-12-11 14:32:05
  • 278
收藏助手
不良信息举报
您举报文章:多标签分类及其 caffe 实现总结
举报原因:
原因补充:

(最多只允许输入30个字)