如何用caffe解决回归问题

如何用caffe解决回归问题,第1张

近在基于caffe做目标检测的问题,需要利用caffe来训练一个回归网络,用来预测object在图像中的位置(x1,y1,width,height)。但是现有的caffe版本(happynear版本)只适用于二分类问题的数据集转换,所以需要修改caffe源码,使之也可以转换回归问题的数据集。
主要是参照进行修改。但是这份博客使用的不是happynear的caffe版本,所以源码改动的地方差异较大。下面我会记录我改动的地方。
一源码修改
1修改caffeproto,位于/src/caffe/proto
36行改成 repeated float label = 5;,然后运行extract_protobat
2修改data_layerhpp

你想调用你的模型,最简单的办法是看examples/cpp_classification里面的cpp文件,那是教你如何调用caffe获取分类结果的(你没接触过caffe的话,建议你直接按照这个文件来 *** 作可能会比较简单,下面我的代码我也不知道没接触过caffe的人看起来

1下载好来自ImageNet的training和validation数据集合;分别存放在如下的格式:
/path/to/imagenet/train/n01440764/n01440764_10026JPEG
/path/to/imagenet/val/ILSVRC2012_val_00000001JPEG
2 进行一些预处理 *** 作:
cd $CAFFE_ROOT/data/ilsvrc12/
/get_ilsvrc_auxsh
3训练数据和测试数据分别放在traintxt和valtxt中,里面有他们的文件和相对应的标签;
4 最后作者把1000类的类名用0--999表示,他们相对应的类别名称则用synset_wordstxt 来存储他们之间的映射。
5作者提到怎么去是否应该先把图像都归一化到256256中,作者提到用Mapreduce去加快这种过程;
也可以直接这么做:
for name in /path/to/imagenet/val/JPEG; do
convert -resize 256x256\! $name $name
Done
6在 create_imagenetsh中设置训练的参数,并在里面指定训练和测试的数据库路径,如果图像没有提前归一化到相同的大小,则需要加”RESIZE=true“,设置”GLOG_logtostderr=1 “表示了可以参考更多的信息,
在执行 /create_imagenetsh 之后会有新的数据文件生成:
ilsvrc12_train_leveldb 和 ilsvrc12_val_leveldb
7 因为模型需要我们减去图像的均值,所以我们需要计算图像均值,在工具
tools/compute_image_meancpp 实现了这种 *** 作,
或者可以直接用:
/make_imagenet_meansh 脚本来进行计算图像均值,并生成:
data/ilsvrc12/imagenet_meanbinaryproto 文件
8定义网络的结构:imagenet_train_valprototxt
里面有两行指定了数据库和图像的路径
source: "ilvsrc12_train_leveldb"
mean_file:"//data/ilsvrc12/imagenet_meanbinaryproto"
并且指定了 include { phase: TRAIN } or include { phase: TEST } 来区分训练和测试
9关于输入层的不同:
训练数据中,,data项来自 ilsvrc12_train_leveldb 并且进行了随机镜像 *** 作,测试数据中data项来自于ilsvrc12_val_leveldb 而没有进行随机镜像 *** 作;
10输出层的不同:
输出层都为 softmax_loss 层,在训练网络当中,用来计算损失函数,并且用来初始化BP过程,测试网络同样有一个第二个输出层,accuracy,它用来报告测试的精度,在训练的过程中,测试网络将实例化并且测试准确率,产成的命令行为:Test score #0: xxx and Test score #1: xxx 等。
11运行网络,其中设置
每批batch为256个,运行450000次迭代,接近90次epoch;
每1000次迭代,就在用测试集进行测试;
设置初始的学习率为001,并且每100000次迭代中进行学习率下降,大概进行20次epoch;
每20次epoch就显示出一些数据信息;
网络训练的动量为09,权重衰减因子为00005,
每10000次迭代中,就生成当前状态的快照;
这些设置在 examples/imagenet/imagenet_solverprototxt 中进行设置,并且同样我们需要指定文件的路径:
net: "imagenet_train_valprototxt"
12开始训练网络:
/train_imagenetsh
13 在K20中,每20个迭代花费36s,所以,一幅图像的一次前馈+反馈(FW+BW)大概需要7ms,前馈花费25ms,剩下的是反馈,
可以在 examples/net_speed_benchmarkcpp 中进行时间的查看;
14因为我们有保存了快照,所以我们可以通过
/resume_trainingsh 来进行resume恢复,脚本caffe_imagenet_train_1000solverstate 保留了要恢复的所有信息,
15总结,Caffe可以很方便进行通过设置文件的方式来进行设置不同的网络结构。

Ubuntu 1404 64位机上用Caffe+MNIST训练Lenet网络 *** 作步骤1将终端定位到Caffe根目录;
2MNIST数据库并解压缩:$ /data/mnist/get_mnistsh
3将其转换成Lmdb数据库格式:$ /examples/mnist/create_mnistsh
执行完此shell脚本后,会在/examples/mnist下增加两个新目录,mnist_test_lmdb和mnist_train_lmdb
4train model:$ /examples/mnist/train_lenetsh
(1)、使用LeNet网络(《Gradient-BasedLearning Applied to Document Recognition》);
(2)、使用/examples/mnist/lenet_train_testprototxtmodel;
(3)、使用/examples/mnist/lenet_solverprototxtmodel;
(4)、执行train_lenetsh脚本,会调用/build/tools目录下的caffe执行文件,此执行文件的实现是/tools目录下的caffecpp文件;
(5)、执行此脚本后,会生成几个文件,其中/examples/mnist/lenet_iter_10000caffemodel则是最终训练生成的model文件;
(6)、以上默认的是在GPU模式下运行,如果想让其在CPU模式下运行,只需将lenet_solverprototxt文件中的solver_mode字段值由原来的GPU改为CPU即可。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12890068.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2025-08-28
下一篇2025-08-28

发表评论

登录后才能评论

评论列表(0条)

    保存