[原]有关Caffe训练好的模型在Python接口下使用分类不准确的问题解决

[原]有关Caffe训练好的模型在Python接口下使用分类不准确的问题解决

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是用来中断训练后重新开始的状态文件。

你可能感兴趣的:([原]有关Caffe训练好的模型在Python接口下使用分类不准确的问题解决)