python测试结果与caffe测试结果不一样
问题描述:
我的问题是关于caffe测试结果。 Python脚本结果不等于caffe测试结果。我使用Alexnet,测试准确度为0,9033。python测试结果与caffe测试结果不一样
来自Caffe测试精度:0.9033
Python的精度: 0.8785
我用40000倍的图像来进行测试。错误分类图像的数量应该是3868.但是,我的python结果中错误分类图像的数量是4859.问题是什么?
谢谢。
这里是我的朱古力测试命令:
…/build/tools/caffe test --model …/my_deploy.prototxt --weights …/alex_24_11__iter_200000.caffemodel -gpu 0 -iterations 800
在那之后,我发现并尝试Python脚本与我的测试数据,但我没有得到同样的结果。 我以前在另一个数据集上使用过这个脚本,而且我的咖啡测试的准确性也一样,但是在训练和测试过程中,我都没有使用均值文件。但现在我用平均文件来训练和测试。可能在平均文件中存在问题,但我使用了从教程中找到的所有内容。
- 我创建了lmdb。
- 我使用compute_image_mean从lmdb创建平均文件。 lmdb中的 图像的大小为256x256。
- 我在alexnet中使用了227x227图像。
Python脚本:
caffe.set_mode_gpu()
model_def = '…/my_deploy.prototxt'
model_weights = '… /alex_24_11__iter_200000.caffemodel'
net = caffe.Net(model_def, model_weights, caffe.TEST)
blob = caffe.proto.caffe_pb2.BlobProto()
data = open('.../image_mean.binaryproto' , 'rb').read()
blob.ParseFromString(data)
arr = np.array(caffe.io.blobproto_to_array(blob))
out = arr[0]
np.save('.../imageMean.npy' , out)
mu = np.load('…/imageMean.npy')
mu = mu.mean(1).mean(1)
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape})
transformer.set_transpose('data', (2,0,1))
transformer.set_mean('data', mu)
transformer.set_raw_scale('data', 255)
transformer.set_channel_swap('data', (2,1,0))
net.blobs['data'].reshape(1, 3, 227, 227)
f = open('…/val.txt', 'r')
f2 = open('…/result.txt', 'a')
for x in range(0,40000):
a=f.readline()
a=a.split(' ')
image = caffe.io.load_image('… /'+a[0])
transformed_image = transformer.preprocess('data', image)
net.blobs['data'].data[...] = transformed_image
output = net.forward()
output_prob = output['prob'][0]
f2.write(str(a[0]))
f2.write(str(' '))
f2.write(str(output_prob.argmax()))
f2.write('\n')
首先我deploy.prototxt
layer {
name: "input"
type: "Input"
top: "data"
input_param { shape: { dim: 1 dim: 3 dim: 227 dim: 227 } }
}
我deploy.prototxt的最后一层的层
layer {
name: "prob"
type: "Softmax"
bottom: "fc8-16"
top: "prob"
}
其他图层等于train_val.prototxt。
答
检查您的预处理在创建LMDB和处理测试数据时是否相同。
例如,如果你使用:
transformer.set_channel_swap('data', (2,1,0))
你应该确保你的LMDB还交换这些渠道(我想这是一个RGB到BGR转换)。
特别是,你说你在训练期间使用了平均值图片。但是,在您的Transformer
中,您正在计算并减去平均值像素。这可以解释你的两个精确度之间的小差异。