Результат теста Python не совпадает с результатом теста caffe

Мой вопрос о результатах теста caffe. Результат скрипта Python не равен результату теста caffe. Я использовал Alexnet, и моя точность теста составляет 0,9033.

Точность теста 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. Я использовал изображения 227x227 в alexnet.

Сценарий 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.


person Can    schedule 05.12.2016    source источник


Ответы (1)


Убедитесь, что ваша предварительная обработка одинакова при создании LMDB и обработке тестовых данных.

Например, если вы используете:

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

Вы должны убедиться, что ваш LMDB также поменял местами эти каналы (я предполагаю, что это преобразование RGB в BGR).

В частности, вы говорите, что использовали подлый образ во время обучения. Однако в Transformer вы вычисляете и вычитаете средний пиксель. Это может объяснить небольшую разницу между вашими двумя точностью.

person nshaud    schedule 19.01.2017