2016-12-05 9 views
1

私の質問はcaffeテストの結果です。 Pythonスクリプトの結果は、Caffeテストの結果と等しくありません。私はアレックスネットを使い、テストの精度は0,9033です。Pythonのテスト結果は、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スクリプトを試してみたが、私は同じ結果を得ることはありません。 私は前回の別のデータセットでこのスクリプトを使用しましたが、私はCaffeテストで同じ精度を得ましたが、電車中でもテスト中でも平均ファイルを使用しませんでした。しかし、私は列車とテストの両方の平均ファイルを使用しました。平均ファイルに問題があるかもしれませんが、私はチュートリアルで見つけたものすべてを使用しました。

  1. 私はlmdbを作成しました。
  2. 私はcompute_image_meanを使ってlmdbから平均ファイルを作成しました。 lmdbの イメージのサイズは256x256です。
  3. 私はalexnetで227x227の画像を使用しました。

Pythonスクリプト:私のdeploy.prototxt私deploy.prototxtの

layer { 
    name: "input" 
    type: "Input" 
    top: "data" 
    input_param { shape: { dim: 1 dim: 3 dim: 227 dim: 227 } } 
} 

最終層の

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') 

まず層

layer { 
    name: "prob" 
    type: "Softmax" 
    bottom: "fc8-16" 
    top: "prob" 
} 

他のレイヤはtrain_val.prototxtと同じです。

答えて

0

LMDBを作成してテストデータを処理する際に、前処理が同じであることを確認してください。例えば

、あなたが使用している場合:

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

あなたのLMDBまたこれらのチャネルをスワップすることを確認する必要があります(私は、これはBGRへの変換RGBであると仮定します)。

特に、トレーニング中に平均画像を使用したとします。ただし、Transformerでは、平均値ピクセルを計算して差し引いています。これはあなたの2つの精度間の小さな違いを説明することができます。

関連する問題