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

Caffe中LMDB接口实现多标签数据准备及训练 Caffe中使用LMDB实现多标签数据的准备 阅读详情

最近在参加一个识别的竞赛,项目里涉及了许多类别的分类,原本打算一个大的类别训练一个分类模型,但是这样会比较麻烦,对于同一图片的分类会重复计算分类网络中的卷积层,浪费计算时间和效率。后来发现现在深度学习中的多任务学习可以实现多标签分类,所有的类别只需要训练一个分类模型就行,其不同属性的类别之间是共享卷积层的。我所有的项目开发都是基于caffe框架的,默认的,Caffe中的Data层只支持单维标签,不支持多标签分类。我也是参考了大牛的博客修改了caffe里面的源码,使得caffe支持多标签分类。下面介绍怎么在caffe中修改源码支持多标签,包括训练和测试过程的修改。 
  Caffe源码修改: 
  需要修改Caffe中的convert_imageset.cpp以支持多标签,convert_imageset.cpp是在caffe的根目录下的tools文件下。我是直接下载了修改后的convert_imageset.cpp替换了我原来的convert_imageset.cpp。然后需要重新编译caffe,进入caffe目录下,输入指令: 
  make clean 
  make –j4 
  make pycaffe 
好了,到了这里如果没有出错caffe就可以支持多标签分类了,接下来就是根据自己的数据和多标签类别数目训练网络模型。 
注:基于好多人找我要convert_imageset.cpp,我把它上传了: 
http://download.youkuaiyun.com/detail/xjz18298268521/9776275 
需要的可以自己去下载。 
 修改代码如下:

 std::ifstream infile(argv[2]);
    std::vector<std::pair<std::string, std::vector<float>> > lines;
    std::string filename;
    std::string label_count_string = argv[5];
    int label_count = std::atoi(label_count_string.c_str());
    std::vector<float> label(label_count);
    while (infile >> filename)
    {
        for (int i = 0; i < label_count;i++)
            infile >> label[i];
        lines.push_back(std::make_pair(filename, label));
    }
    // Create new DB
    scoped_ptr<db::DB> db_image(db::GetDB(FLAGS_backend));
    scoped_ptr<db::DB> db_label(db::GetDB(FLAGS_backend));
    db_image->Open(argv[3], db::NEW);
    db_label->Open(argv[4], db::NEW);
    scoped_ptr<db::Transaction> txn_image(db_image->NewTransaction());
scoped_ptr<db::Transaction> txn_label(db_label->NewTransaction());
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

训练模型: 
  上面我们就有了多任务的深度学习的基础部分数据输入。为了向上兼容Caffe框架,我也是参考了大牛的博客,摒弃了部分开源实现增加Data层标签维度选项并修改Data层代码的做法,直接使用两个Data层将数据读入,即分别读入数据和多维标签。接下来详细介绍训练所需要做的步骤以及和修改。 
 

1. Lmdb的数据制作 
   由于篇幅的原因,我只贴了部分主要的代码图,注意下图标红的部分,第一个是你多标签所需要的类别数目,第二个是一些数据的路径。 
  由于现在为了支持多标签,把数据和标签分开了,以前的单标签在data层数据和标签在一起的对应的(自己的理解)。所以第三和第四初标红的是test和train最后用于训练的lmdb数据和对应多维标签。这制作lmdb脚本文件我会放在我的博客资源上: 
  http://download.youkuaiyun.com/detail/xjz18298268521/9708564 
  你们可以根据自己的需求下载后自己修改,执行脚本文件后,相对应的路径下会生成对应的四个lmdb数据文件。到这里lmdb的数据制作完毕,后面的均值文件的制作和原来的是一样的。 
  这里写图片描述
2.修改训练网络模型train_val.prototxt

#训练数据层
name: "CaffeNet"
layer {
  name: "data"
  type: "Data"
  top: "data"  #原来的是两层top
  include {
    phase: TRAIN
  }
  transform_param {
    mirror: true
    crop_size: 227
    mean_file: "/home/xjz/multiple-caffe/caffe-master/examples/multiple-lable/caffenet/mean.binaryproto"
  }
  data_param {
    source: "/home/xjz/multiple-caffe/caffe-master/examples/multiple-lable/caffenet/ten_classes_train_lmdb"
    batch_size: 128
    backend: LMDB
  }
}
#训练数据标签层
layer {
  name: "data"
  type: "Data"
  top: "label"
  include {
    phase: TRAIN
  }
  data_param {
    source: "/home/xjz/multiple-caffe/caffe-master/examples/multiple-lable/caffenet/ten_classes_train_label_lmdb"
    batch_size: 128
    backend: LMDB
  }
}
#测试数据层
layer {
  name: "data"
  type: "Data"
  top: "data"
  include {
    phase: TEST
  }
  transform_param {
    mirror: false
    crop_size: 227
    mean_file: "/home/xjz/multiple-caffe/caffe-master/examples/multiple-lable/caffenet/mean.binaryproto"
  }
  data_param {
    source: "/home/xjz/multiple-caffe/caffe-master/examples/multiple-lable/caffenet/ten_classes_val_lmdb"
    batch_size: 100
    backend: LMDB
  }
}
#测试数据标签层
layer {
  name: "data"
  type: "Data"
  top: "label"
  include {
    phase: TEST
  }
  data_param {
    source: "/home/xjz/multiple-caffe/caffe-master/examples/multiple-lable/caffenet/ten_classes_val_label_lmdb"
    batch_size: 100
    backend: LMDB
  }
}
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67

  修改完网络模型的data层,后面需要将标签数据库中的内容进行切分,拆分成各个属性的标签,需要添加Slice层,Slice层是将一个输入层根据切割指标给定的维度(现在只有num和channel)切割成多个输出层,如下图所示。有几类标签就定义几类top并命名不同,用于连接最后的accuracy层。对于slice层的参数:

  • slice_dim: 目标维度,0 for num and 1for channel,一般选1;
  • slice_point:指定选定维数的索引(索引的数量必须等于blob数量减去一),我一共是4,所以减一为3。 
               这里写图片描述 
    3.最后的损失函数的设计 
       以前单标签的时候,只需要设计一个损失函数,现在是多标签分类需要设计多个损失函数层,使得每一大类别对应一个损失函数层,下图是一个类别的损失函数层和对应的test层: 
    对于Accuracy层中的两个bottom:第一个需要连接对应的全连接层,第二个需要连接前面用slice层切割对应的标签层。 
      对于softmaxwithloss层的两个bottom:第一个需要连接对应的全连接层,第二个需要连接前面用slice层切割对应的标签层。Loss_weight:需要填写这个损失函数的损失值在最终总的损失函数值中所占的权重值,一般的,建议所有任务的权重值相加为1,如果这个数值不设置,可能会导致网络收敛不稳定,这是因为多任务学习中对不同任务的梯度进行累加,导致梯度过大,甚至可能引发参数溢出错误导致网络训练失败。 
             这里写图片描述 
      这里还有一个问题,就是以前单标签的时候,最后一层的全连接层fc8层的out_num是固定的,大小是根据单标签分类的类别数目来定的,而现在多标签中的每一个标签的类别属性大小是不同一的。所以这里在每一标签对应的损失函数前添加一个全连接层,对应的输出out_num大小等于对应标签的类别数目。添加的所有全连接层都连接到原来的第二个全连接层,即fc7层,如下图所示,到这里训练基本的都准备完毕,后面的训练的步骤和原来单标签的训练基本是一样的,接下来就可以训练了。 
              这里写图片描述 
    测试过程 
      修改deploy.prototxt文件,前面的网络层是不需要修改的,只需要修改对应的最后一层全连接层和损失函数层,修改的方式和前面训练trian_val.prototxt的是一样的,每一个标签类别需要一个属于自己的全连接层和损失函数层,如下图所示: 
              这里写图片描述
顶
3
踩
caffe 实现多标签输入(multilabel、multitask) caffe 本身并不支持 多类标的输入, 该框架主要用于解决图片分类的问题,而目前,两个重要的问题需要多标签的输入:多任务学习(multi-task)和多标签分类(multi-label),本文针对这两个问题,实现了多标签的输入            目前,网上流行的多标签输入方法主要有以下四种:          1. 最简单,使用mxnet,它本身支持了多标签分类的问题,因此也自带了多标 阅读详情

相关推荐

Caffe 实现多标签分类

最近在用Caffe做验证码识别时,发现没有用Tensorflow简单(tensorflow中可以用one-hot, 参考我的另一篇blog:  http://blog.youkuaiyun.com/sushiqian/article/details/78305340 ),需要修改Caffe的源码,做完后,觉得也不复杂。 1. 首先,就是修改源码了,本文介绍的方法是修改ImageDataLayer,修改下面的

frontworld的博客 3788

caffe中几个基本概念

caffe中几个基本概念: 1 caffe中的blob结构是用来进行数据存储,交换和处理网络中正向反向迭代时的数据和导数信息的数据结构 blob是caffe的标准数组结构,他提供了一个统一的内存接口,其将内部的cpu,gpu数据之间的传输与存储封装起来,免去用户外部对gpu的操作 blob详细描述了信息是如何在layer和net中存储和交换的Blob 是 Caffe 中处理和传递实际数据的数据

葫芦与瓢的博客 3406

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

Caffe自带的图像转LMDB接口只支持单label,对于多label的任务,可以使用HDF5的格式,也可以通过修改caffe代码来实现, 我的文章Caffe 实现多标签分类 里介绍了怎么通过修改ImageDataLayer来实现Multilabel的任务, 本篇文章介绍怎么通过修改DataLayer来实现带Multilabel的LMDB格式数据输入的分类任务 1. 首先修改代码       

frontworld的博客 5495

多标签分类怎么做?教你4招

首先简单介绍下,多标签分类与多分类、多任务学习的关系:多分类学习(Multi-class):分类器去划分的类别是多个的,但对于每一个样本只能有一个类别,类别间是互斥的。例如:分类器判断这只动物是猫、狗、猪,每个样本只能有一种类别,就是一个三分类任务。常用的做法是OVR、softmax多分类多标签学习(Multi-label ):对于每一个样本可能有多个类别(标签)的任务,不像多分类任务的类别是互斥。例如判断每一部电影的标签可以是多个的,比如有些电影标签是【科幻、动作】,有些电影是【动作、爱情、谍战】。

m0_59596937的博客 7219

Caffe多标签分类

http://blog.youkuaiyun.com/shuzfan/article/details/52503683 http://blog.youkuaiyun.com/u011762313/article/details/48851015 可参考这两篇博客。

支持多标签的convert_imageset.cpp代码

将此convert_imageset.cpp替换caffe中的原来的convert_imageset.cpp重新编译caffe,就能是caffe支持多标签输出

多标签分类与多任务学习

多标签分类 0. 问题概述 对于标签分类问题,表示事物本身可以分为多个类别,但是对于每一个样本存在至少一个类别,例如分类猫、狗、植物、动物。一个样本是猫的同时,又属于动物。因此就不能再像以往的模型一样,输出用softmax激活函数激活,因为我们最终的输出标签可能同时有很多的类,例如鸟类有羽毛和啄。 1. 搭建模型 通常对多标签任务可以采取两种网络模型,一种是直接输出一个全连接层分支,最后一层输出的神经元数应与标签数量相同,使用Sigmoid函数激活,将数值映射在0~1之间。不像Softmax函数,最后一层输

Exploer_TRY的博客 4044

通俗地解释一下 EMD(经验模态分解,Empirical Mode Decomposition)

EMD 就像把一碗“混在一起的面条”分成不同粗细的面条,方便你逐层分析每种波动。

qlkaicx的博客 1249

caffe实现多任务学习

Github: https://github.com/Haiyang21/Caffe_MultiLabel_Classification Blogs 1.采用多label的lmdb+Slice Layer的方法 http://blog.youkuaiyun.com/u013010889/article/details/53098346 2. 修改数据层方法 http://blog.csdn.n...

weixin_34410662的博客 102

Ubuntu20.04安装Torque-6.1.2单机版(踩坑篇)

说明:PBS排队系统原先是在Centos7安装使用很顺利,但是有客户需求在Ubuntu20.04上使用,着手在Ubuntu20.04安装上安装的时候发现很多报错,并不能顺利安装,网上查找到的教程,有的说是让放弃转slurm,有的是换源安装,但是安装好的版本很低,有许多bug,不是很好用。经过自己慢慢摸索之后,改了部分配置以及源码之后,能够顺利安装,再次记录一下踩坑心得,与大家一起分享学习。如有问题,欢迎大家来撩。...............

华青水上的博客 8087

Vast.ai GPU服务器租用与SSH密钥连接实战指南

本文详细介绍了如何在Vast.ai平台租用GPU服务器并通过SSH密钥安全连接的全流程。从注册、选配GPU型号到SSH密钥生成与配置,再到实战中的端口转发和文件传输技巧,帮助用户高效利用云端GPU资源进行深度学习等计算密集型任务。

weixin_29574585的博客 530

多标签分类

多标签分类(multilabel classification )多标签分类(multilabel classification )多标签分类问题caffe 每个样本对应多个label? 使用caffe训练一个多标签分类/回归模型使用caffe fine-tune一个单标签图像分类模型基于caffe的googlenet的多标签检测https://github.com/Numeria-Jun/mul...

Marshall的专栏 4892

本地部署静态网站托管平台 Netlify 并实现外部访问(Windows 版本)

Netlify 是一款基于云计算的网站部署和托管平台,专为开发者提供便捷的静态网站和 Jamstack 应用部署服务。它的能力在于将网站构建、部署、托管以及持续集成等流程高度集成,简化了开发和运维的复杂程度。用户无需关心服务器的配置、维护等工作。本文将详细介绍如何在本地安装 Netlify 以及结合路由侠内网穿透实现外网访问 Netlify。

lyxnwct的博客 524

caffe多任务、多标签

  解决的目标问题:多分类问题,比如车辆的外形和颜色,苹果的大小和颜色;多任务:车牌角点的定位和车牌的颜色。定位在技术上属于回归,车牌颜色判断则属于分类。      技术点      caffe默认是单输入任务单标签的,也就是一个样本,其任务只有一个,标签只有一个,比如图片是什么颜色,图片是什么物体。      # ${caffe_src_root}/tools/convert_imageset....

li123128的博客 551

数字信号处理实验:信号谱分析与FFT算法的应用

​ (1)给定信号为 ,其中a为42,b为1。理论分析信号 的频率成分。 (2)分别采用采样频率为 , , , 对 进行采样,其中 , , , ,根据是否满足采样定理要求分析四种采样频率下频谱的分布,在满足采样定理情况下做频谱分析。 (3)任意生成两组有限长信号,对信号分别进行直接卷积和FFT算法求卷积,并分析圆周卷积与线性卷积的关系。

m0_56324525的博客 3203

【LangChain编程:从入门到实践】实现多模态代理

【LangChain编程:从入门到实践】实现多模态代理 关键词:LangChain, 多模态代理, 自然语言处理, 机器学习, 知识图谱, 对话系统, 代码生成, AI代理 1. 背景介绍 随着人工智

欢迎来到我的优快云空间!这里聚焦AI大模型应用实战,分享前沿技术、实战案例与开发经验。 581

caffe实现多标签分类

最近在参加一个识别的竞赛,项目里涉及了许多类别的分类,原本打算一个大的类别训练一个分类模型,但是这样会比较麻烦,对于同一图片的分类会重复计算分类网络中的卷积层,浪费计算时间和效率。后来发现现在深度学习中的多任务学习可以实现多标签分类,所有的类别只需要训练一个分类模型就行,其不同属性的类别之间是共享卷积层的。我所有的项目开发都是基于caffe框架的,默认的,Caffe中的Data层只支持单维标签...

m0_37192554的博客 796

5.7 BGP属-ORIGIN

注意:当去往同一个目的地存在多条不同Origin属性的路由时,在其他条件都相同的情况下,BGP将按如Origin的下顺序优选路由:IGP > EGP > Incomplete。通过以上输出可以看到路由表选择了R3发过来的路由,因为R1的路由的起源为?通过以上输出我们可以看到针对于1.1.1.1这条路由有两条,从R1和R3传过来的起源都属于IGP。(4)把从R1传过来的路由的起源改为incomplete。通过以上输出可以看到,从R1传过来的路由是最优的。(2)在R2上查看1.1.1.1的路由详细信息。

lwljh134的博客 308

caffe hdf5,多标签数据的训练prototxt,例子,需要一个slice层

版权声明:本文为jiarenyf原创文章,未经允许也可以转载,但是附上链接…… https://blog.youkuaiyun.com/u011762313/article/details/48851015 &lt;/div&gt; &lt;div id="content_views" class="markdown_views"...

m0_37192554的博客 557

基于YOLOv5/v8/v10的答题卡填涂识别与评分系统(附数据集+UI界面+完整代码)

在教育信息化的大背景下,传统的手工阅卷方式正在被智能化技术所取代。答题卡识别作为标准化考试的核心环节,其准确率和效率至关重要。本文将详细介绍如何利用YOLO系列目标检测算法(YOLOv5、YOLOv8、YOLOv10)构建一个答题卡填涂识别与评分系统。文章从数据集的制作与标注开始,逐步深入到模型的训练、评估与对比,最后基于PyQt5设计了一个用户友好的桌面端UI界面,实现了从图像输入到得分输出的全流程自动化。

YOLO 638

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

MTCNN训练环境搭建(一)

多标签分类在工程上有很多应用,例如,输入一张图片,判断这个人的年龄、性别和是否配戴眼镜。这时,数据集的label文件应当具有这样的格式: 000001.jpg 22 1 0 000002.jpg 30 1 1 000003.jpg 44 0 1 000004.jpg 17 0 0 假定第一个数字表示年龄...

romeosgood的博客 901

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

上一篇: 静态库and动态库区别(Linux)
下一篇: Faster RCNN roi_pooling_layer.cpp roi_pooling_layer.cu
2014wzy
博客等级 码龄13年 759粉丝 85原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值