2016-12-05 2 views
1

제 질문은 caffe 테스트 결과입니다. 파이썬 스크립트 결과는 카페 테스트 결과와 동일하지 않습니다. 나는 Alexnet을 사용했고 테스트 정확도는 0,9033입니다.Python 테스트 결과가 Caffe 테스트 결과와 동일하지 않습니다.

CAFFE 테스트 정확도 : 0.9033

파이썬 정확도 : 0.8785

내가 테스트 40000 개 이미지를 사용했다. 오 분류 이미지의 수는 3868 여야합니다. 그러나 파이썬 결과의 오 분류 이미지 수는 4859입니다. 문제점은 무엇입니까?

감사합니다. , 내가 찾은 내 시험 데이터와 파이썬 스크립트를하려고 그 후

…/build/tools/caffe test --model …/my_deploy.prototxt --weights …/alex_24_11__iter_200000.caffemodel -gpu 0 -iterations 800 

하지만이 같은 결과를 얻을하지 않습니다

여기 내 CAFFE 테스트 명령입니다. 이전에 다른 데이터 세트에서이 스크립트를 사용했기 때문에 Caffe 테스트에서 동일한 정확도를 얻었지만 기차도 테스트 중에도 평균 파일을 사용하지 않았습니다. 하지만 지금은 train과 test라는 두 파일을 사용했습니다. 평균 파일에는 문제가있을 수 있지만 튜토리얼에서 찾은 모든 것을 사용했습니다.

  1. 나는 lmdb를 만들었습니다.
  2. 나는 compute_image_mean을 사용하여 lmdb에서 평균 파일을 만들었습니다. lmdb의 이미지 크기는 256x256입니다.
  3. 나는 alexnet에서 227x227 이미지를 사용했다.

파이썬 스크립트 내 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에서 평균 픽셀을 계산하고 빼는 것입니다. 이것은 두 정확도 사이의 작은 차이를 설명 할 수 있습니다.

관련 문제