您的位置:首页 > 编程语言 > Python开发

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

2017-11-16 09:15 489 查看
之前使用caffe训练了1k个自己的数据,有3个分类,在consol下面训练加验证的结果是85%左右的准确率,还是可以的.

但是问题是,当使用了Python接口,导入caffemodel文件和npy均值文件后,分类结果完全惨不忍睹,全部都偏向第一分类.

经过不懈的google,终于发现了问题所在.

最初定义caffe的网络结构时,用的是如下语句

[python] view
plain copy

net = caffe.Classifier(MODEL_FILE, PRETRAINED,mean=np.load(npy_mean_file))  

运行的时候没报错,但是结果十分不正常.于是改到下面

[python] view
plain copy

net = caffe.Classifier(MODEL_FILE, PRETRAINED)  

就是去掉了均值文件的选项,只保留训练参数和部署网络结构.

这时分类结构少许正常,但是还是又很大偏差.最后在一片google users小组的帖子里,找到了部分原因.就是经过 系统自带功能 形成image_mean binaryproto的时候,会把彩图的RGB通道换成BGR通道,所以在 构建网络的时候,要加入 channel_swap(2,1,0)的选项.

于是加入

[python] view
plain copy

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

当时不记得是在解决什么问题的时候看到说要在mean = np.load(mean_file)后面加上.mean(1).mean(1)

看代码看了好一段时间都没有解决同一数据集在测试和训练验证时得到的精度不一致的问题

看到网上也有人问类似的问题,但解决方法对于我的情况都不适用

今天脑子可能突然开窍,想着删掉后面的.mean(1).mean(1)试一下效果,结果就惊奇地解决了这个问题,而且程序也没有报错

当时加这个的时候也没多想为什么,我的理解是两次mean(1)之后得到的是一个值(三通道的话是对应通道的三个值),相当于对于每一个输入所有的像素点都减去同一个均值,而原始的mean_file是与输入大小一样的均值矩阵

import numpy as np

mean = np.load('chromosomes_mean.npy')
print mean.shape
print mean.mean(1).shape
print mean.mean(1).mean(1).shape


output:

(3, 200, 200)

(3, 200)

(3,)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐