caffe新手训练模型遇到的重重阻碍——辛酸史

从昨天早上开始第一次自己训模型,虽然之前简单了解过流程,套路很简单,但是截至到昨天下午才开始训练起来,晚上又一直在捣腾测试模型的方法(因为想偷懒,不想写代码去测试,在网上找了直接在命令行测试的方法),捣腾了几个小时,到今天早上才解决。这中间出现了好多问题,不过第一次嘛,这种情况难免,以后就有经验了。

整个流程都是在参考这个链接,个人觉得写得很好,适合新手http://www.cnblogs.com/denny402/p/5083300.html

下面简单记录以下遇到的问题:

1. 由于txt文件都提前有了,所以略过,直接转换数据格式为LMDB(后来才知道不转也行), 转的时候不知道这个路径是啥,试过删掉,但是失败了。在网上查了caffe自带的create_minist.sh文件的注释后才知道这个路径是图片所在路径。

/home/xxx/caffe/data/re/

2. 均值文件很顺利,solver.prototxt的参数值很多都没改,后来发现并不是,尤其是test_iter,这个参数要用测试集的数据量/batch_size

3. 接着就开始用train.sh脚本开始训模型,以为终于结束了,结果又报错:

ImageData层读取lmdb文件 check failed:!lines_.empty() File is empty

解决方案:追溯到caffe源文件里发现lmdb文件根本没有读取到,一开始在网上有人说把绝对路径改成相对路径,但是还是不对。最后查了ImageData和Data层的参数才知道ImageData层没有LMDB格式,干脆换成了Data层,不能让我的数据白白转换了,网络结构中一些参数也做了相应调整。其实一开始直接用txt文件,就会省去这些问题,不过也学到了。记住:ImageData--LMDB,Data--txt

4.还遇到了下面这个问题,不过忘了是在哪一步了。


check failed:mdb_status ==0(2 vs. 0)

caffe新手训练模型遇到的重重阻碍——辛酸史

5. 终于开始测试了,在网上查了一个可以在命令行测试的脚本,一直报错,别人一试就OK,后来请教了师兄,才知道我测试用的网络结构是训练时用的,当时觉得自己够蠢的,都不知道训练和测试的网络结构不一样。对比着别人的两个文件,勉强把自己的deploy.prototxt弄出来了。重点是input层和最后的softmax层的改变,中间都不变,而且测试网络里面不需要有路径。其实网上都能查到方法,只是一开始不知道自己的做法是条不归路。

6. 拿到的数据里还有验证集,对于验证集的作用也很懵,干脆就不用了。结果师兄说正常情况下是要用验证集提高泛化性。直接问师兄数据从哪里往进送,才知道train.prototxt中的Data层的TEST部分,是要输入验证集的均值文件和数据。迭代一定次数后通过验证集测试精度,然后网络自动调整参数。在此之前我竟然放的是测试集的均值文件和数据。

7. 都改好了,测试代码也写好了,结果,又又又.....报错了!忘了具体错误是啥了,大概意思说我的图像属性跟测试网络中shape的第二个参数不一致。一查是通道数不一致,原来我训练的图片是3通道,网络结构里的参数是单通道,现在又用3通道的图像测参数为单通道的网络,当然要报错了。最后又重新转换了数据格式,加了转单通道的条件,才开始顺利测试。

第一次训练模型好艰辛,自己都被自己感动到了caffe新手训练模型遇到的重重阻碍——辛酸史,不过凡事都有第一次,第一次多摔几跤,多积累一点经验。