用caffe训练、测试caffenet

ILSVRC12 数据集下载

http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_val.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_train.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_devkit_t12.tar
http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_bbox_train_v2.tar
使用linux命令wget:
wget -cb http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.tar
wget是linux下一个从网络上自动下载文件的常用自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理。
-c:这个也非常常见, 可以断点续传, 如果不小心终止了, 可以继续使用命令接着下载
-b:后台下载,Wget默认的是把文件下载到当前目录。
-O:将文件下载到指定的目录中。
-P:保存文件之前先创建指定名称的目录。
-t:尝试连接次数,当Wget无法与服务器建立连接时,尝试连接多少次。
-r:使用递归下载
下载完:
tar -xvf ILSVRC2012_img_test.tar -C test
tar -xvf ILSVRC2012_img_train.tar -C train
for i in *.tar ; do mkdir ${i%%.*};tar -xvf $i -C ${i%%.*}; done

i%%.就是把i中.左边的拿出来
i%.
就是把i中.右边的拿出来

Data Preparation

./data/ilsvrc12/get_ilsvrc_aux.sh
训练和测试的输入是用train.txt和val.txt描述的,以文本形式列出所有文件及标签,注意这里使用与ILSVRC工具集不同的标签索引:按ASCII码顺序对类名进行排序,然后依次标注为0~999(注意是从0开始的),synset_words.txt中是synset(eg:n01440764)与类别名的映射。
我现在只保留了n01440764、n01443537、n01484850、n01491361、n01494475这5类。train.txt和val.txt也相应为这五类。
看一下examples/imagenet/create_imagenet.sh文件,在example/imagenet下新建一个文件夹,名为myself,把所有要用到的图片和脚本放进去,包括create_imagenet.sh,我们在这里面修改它:
EXAMPLE=/home/meng/caffe/examples/imagenet/myself
DATA=/home/meng/caffe/examples/imagenet/myself
TOOLS=/home/meng/caffe/build/tools
TRAIN_DATA_ROOT=/home/meng/caffe/examples/imagenet/myself/train
VAL_DATA_ROOT=/home/meng/caffe/examples/imagenet/myself/val
RESIZE=true
RESIZE=true表示要在这里resize图像大小,如果预处理时没有做过resize这里一定要设置。GLOG_logtostderr=1是转储信息供人检查的,可以忽略它。运行:
./examples/imagenet/myself/create_imagenet.sh
在myself下生成lmdb格式的图像信息。

Compute Image Mean

模型要求从每个图像中减去图像均值,因此先要用tools/compute_image_mean.cpp计算均值,这个cpp同时也可以让我们熟练掌握如何控制多个组件,例如protocol buffer,leveldb,logging。均值可以运行如下命令计算:
./examples/imagenet/myself/make_imagenet_mean.sh
运行前修改一下几个路径:
EXAMPLE=/home/meng/caffe/examples/imagenet/myself
DATA=/home/meng/caffe/examples/imagenet/myself
运行后在myself下生成imagenet_mean.binaryproto文件。

遇到的问题:
std::bad_alloc 的问题
这问题怎么都找不到解决方法呀,直到我看了看ilsvrc12_train_lmdb下的data和lock的大小,发现只有8kb。此时我才想可能是lmdb文件没有创建成功。于是重新回去create_imagenet.sh。此时:
遇到问题:
meng@DL:~/caffe/examples/imagenet/myself$ ./create_imagenet.sh
Creating train lmdb...
I0326 16:07:47.444555 2317 convert_imageset.cpp:86] Shuffling data
I0326 16:07:48.057821 2317 convert_imageset.cpp:89] A total of 6500 images.
F0326 16:07:48.057941 2317 db_lmdb.cpp:13] Check failed: mkdir(source.c_str(), 0744) == 0 (-1 vs. 0) mkdir /home/meng/caffe/examples/imagenet/myself/ilsvrc12_train_lmdb failed
*** Check failure stack trace: ***
@ 0x7f66cace35cd google::LogMessage::Fail()
@ 0x7f66cace5433 google::LogMessage::SendToLog()
@ 0x7f66cace315b google::LogMessage::Flush()
@ 0x7f66cace5e1e google::LogMessageFatal::~LogMessageFatal()
@ 0x7f66cb0d0c08 caffe::db::LMDB::Open()
@ 0x403aaf main
@ 0x7f66c9c54830 __libc_start_main
@ 0x404b59 _start
@ (nil) (unknown)
Aborted (core dumped)
原来是因为ilsvrc12_train_lmdb和ilsvrc12_val_lmdb的存在造成的,删掉。

Model Definition

caffenet 就是Krizhevsky, Sutskever, and Hinton 在 NIPS 2012 paper提出的模型(Alexnet)的一个复现。

在文件models/bvlc_reference_caffenet/train_val.prototxt(这个文件我们也把它放在myself里)里,有一些标记phase:TRAIN or phase:TEST,这允许我们在一个文件里定义两个相似的网络。一个网络训练时用,一个网络测试时用(我觉得是val时用)。在这两个网络之间,只有输入层和输出层不同。
输入层的不同:训练网络从examples/imagenet/ilsvrc12_train_leveldb取数据,并对输入图片随机取镜像;测试网络从examples/imagenet/ilsvrc12_val_leveldb取数据,不随机取镜像。(这里我们全部改成在myself里取数据,在train_val.prototxt里改,注意一定要改成/home/meng下的)
输出层的不同:两个网络都输出softmax_loss层,train时,这个层用来计算损失函数和初始化反向传播;在validation时,损失没什么用,测试网络还有第二输出层:accuracy。在测试过程中,测试网络会实例化并在测试集上测试,产生Test score #0:xxxTest score #1:xxx。其中0代表accuracy,1代表loss。

把models/bvlc_reference_caffenet/solver.prototxt也复制到myself下,把其中的网络模型路径也改成我们自己的,下面是具体参数设计(根据自己的数据集做了一点修改):
net和snap不要忘记改

  • 每一个batch有64(防止内存不够)个图像,总共是10,000次迭代
  • 每200次迭代,在验证数据上测试一次学到的网络
  • 设置初始化的学习率为0.003,每2,000次迭代后减少一次
  • 信息每20次迭代会显示一次
  • 网络训练的动量为0.9,权重衰减为0.00015
  • 对于每1,000次迭代,取一次当前状态的快照

Training ImageNet

把train_caffenet.sh也复制进myself,修改里面的内容为:
./build/tools/caffe train --solver=examples/imagenet/myself/solver.prototxt

运行脚本:

./examples/imagenet/myself/train_caffenet.sh

如果想要深度剖析计算时间,可以把下面的命令写到train_caffenet.sh中或直接运行:

./build/tools/caffe time –-model=examples/imagenet/myself/train_val.prototxt

结果;Test net output #0: accuracy = 0.756
Test net output #1: loss = 1.52813 (* 1 = 1.52813 loss)

Resume Training?

如果出了什么意外中断了训练,那真是天都要塌了,所以快照存储了训练的中间结果,这个设计真是人性化,当再次训练时,就可以从快照中恢复数据了。执行下列命令,就能恢复:
./build/tools/caffe train --solver=models/bvlc_reference_caffenet/solver.prototxt --snapshot=models/bvlc_reference_caffenet/caffenet_train_iter_10000.solverstate
这里的caffenet_train_10000.solverstate就是存储了恢复solver状态所需的所有必要信息的快照,具体是哪个solverstate是可以自己改的。

参考博客:http://blog.csdn.net/liumaolincycle/article/details/48475479

posted on 2017-10-24 22:55  MissSimple  阅读(3365)  评论(0编辑  收藏  举报

导航