有关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是与输入大小一样的均值矩阵
output:
(3, 200, 200)
(3, 200)
(3,)
但是问题是,当使用了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,)
相关文章推荐
- [原]有关Caffe训练好的模型在Python接口下使用分类不准确的问题解决
- 有关Caffe训练好的模型在Python接口下使用分类不准确的问题解决
- caffe+python 使用训练好的VGG16模型 对 单张图片进行分类,输出置信度
- caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片
- caffe python接口:用训练好的模型来分类
- caffe的python接口学习:用训练好的模型(caffemodel或者h5)来分类新的图片
- 解决使用mvnc进行caffe模型分类报_imagingtk找不到的问题
- 【Caffe的C++接口使用说明(三)】Ubuntu14.04下Caffe利用训练好的模型进行分类的C++接口使用说明(三)
- caffe+python 使用训练好的VGG16模型 对 单张图片进行分类,输出置信度
- caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片
- caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片
- caffe的python接口学习(6):用训练好的模型(caffemodel)来分类新的图片
- Caffe——python接口学习(6):用训练好的模型来分类新的图片
- caffe的python接口学习(3):训练模型(training)
- 使用caffe的Python接口进行训练测试
- 使用MATLAB加载训练好的caffe模型进行识别分类
- caffe 09 win10 使用训练好模型为给定图片分类
- Caffe windows下入门级别的从编译到训练然后到分类(用python接口)资源下载(一)
- 使用caffe训练一个多标签分类/回归模型
- caffe的python接口学习(3):训练模型(training)