2015-3-30阅读516 评论2
之前使用caffe训练了1k个自己的数据,有3个分类,在consol下面训练加验证的结果是85%左右的准确率,还是可以的.
但是问题是,当使用了Python接口,导入caffemodel文件和npy均值文件后,分类结果完全惨不忍睹,全部都偏向第一分类.
经过不懈的google,终于发现了问题所在.
最初定义caffe的网络结构时,用的是如下语句
net = caffe.Classifier(MODEL_FILE, PRETRAINED,mean=np.load(npy_mean_file))运行的时候没报错,但是结果十分不正常.于是改到下面
net = caffe.Classifier(MODEL_FILE, PRETRAINED)就是去掉了均值文件的选项,只保留训练参数和部署网络结构.
这时分类结构少许正常,但是还是又很大偏差.最后在一片google users小组的帖子里,找到了部分原因.就是经过 系统自带功能 形成image_mean binaryproto的时候,会把彩图的RGB通道换成BGR通道,所以在 构建网络的时候,要加入 channel_swap(2,1,0)的选项.
于是加入
net = caffe.Classifier(MODEL_FILE, PRETRAINED,mean=np.load(npy_mean_file), channel_swap=(2,1,0))结果还是不咋地,没啥变化,这个时候有点桑心.这个时候看了官方的一个例子.于是借鉴里面的语句,没怎么改,如下:
net = caffe.Classifier(MODEL_FILE, PRETRAINED,mean=np.load(npy_mean_file).mean(1).mean(1), channel_swap=(2,1,0),raw_scale=255,image_dims=(100,100))
分类结果正确了.
~~~~~~~~~~~~~~~~
分析原因:一开始没有跟着官方的例子来是因为原文是根据ImageNet 的结构来的,数据集也是,我怕不一致导致有问题.最后的不准确原因在于:
1.通道没有置换过来,
2.raw_scale = 255 是像素值范围,不是(0,1),因为我们使用了均值文件,虽然减去了均值,但是还是255的范围.不然肯定出错
3.image_dims = (100,100)这个是你打包图片进行训练的时候使用的尺寸,也要一致,不然就会报错.
4.mean = (****).mean(1).mean(1)这个后面加mean(1)..应该是numpy的一个功能,可以使分类结果更加突出,这时测试过得,也会使错误结果更加错~~- - !
=====================================
官方的Python代码实例为:(链接)点我(点)。
用生成的caffemodel文件去做分类,solverstate是用来中断训练后重新开始的状态文件。