2016-12-05 212 views
1

我的問題是關於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腳本與我的測試數據,但我沒有得到同樣的結果。 我以前在另一個數據集上使用過這個腳本,而且我的咖啡測試的準確性也一樣,但是在訓練和測試過程中,我都沒有使用均值文件。但現在我用平均文件來訓練和測試。可能在平均文件中存在問題,但我使用了從教程中找到的所有內容。

  1. 我創建了lmdb。
  2. 我使用compute_image_mean從lmdb創建平均文件。 lmdb中的 圖像的大小爲256x256。
  3. 我在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。

回答

0

檢查您的預處理在創建LMDB和處理測試數據時是否相同。

例如,如果你使用:

transformer.set_channel_swap('data', (2,1,0)) 

你應該確保你的LMDB還交換這些渠道(我想這是一個RGB到BGR轉換)。

特別是,你說你在訓練期間使用了平均值圖片。但是,在您的Transformer中,您正在計算並減去平均值像素。這可以解釋你的兩個精確度之間的小差異。