0

Я пытаюсь использовать Caffe C++ classification пример (вот code), чтобы классифицировать изображение с помощью рукописной цифры (я тренирую свою модель в базе данных MNIST), но она всегда возвращает вероятности, такие какCaffe classifocation.cpp всегда возвращает 100% вероятность

[0, 0, 0, 1.000, 0, 0, 0, 0, 0] (1.000 can be on different position) 

даже если изображение не имеет на нем номера. Я думаю, что это должно быть что-то вроде

[0.01, 0.043, ... 0.9834, ... ] 

Также, например, для «9» он всегда предсказывает неправильное число.
только одна вещь, которую я могу изменить в classification.cpp, что я всегда с помощью CPU

//#ifdef CPU_ONLY  
    Caffe::set_mode(Caffe::CPU); // <----- always CPU 
//#else 
// Caffe::set_mode(Caffe::GPU); 
//#endif 

Это как мой deploy.prototxt выглядит

name: "LeNet" 
layer { 
    name: "data" 
    type: "ImageData" 
    top: "data" 
    top: "label" 
    image_data_param { 
    source: "D:\\caffe-windows\\examples\\mnist\\test\\file_list.txt" 
    } 
} 
layer { 
    name: "conv1" 
    type: "Convolution" 
    bottom: "data" 
    top: "conv1" 
    param { 
    lr_mult: 1 
    } 
    param { 
    lr_mult: 2 
    } 
    convolution_param { 
    num_output: 20 
    kernel_size: 5 
    stride: 1 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 
layer { 
    name: "pool1" 
    type: "Pooling" 
    bottom: "conv1" 
    top: "pool1" 
    pooling_param { 
    pool: MAX 
    kernel_size: 2 
    stride: 2 
    } 
} 
layer { 
    name: "conv2" 
    type: "Convolution" 
    bottom: "pool1" 
    top: "conv2" 
    param { 
    lr_mult: 1 
    } 
    param { 
    lr_mult: 2 
    } 
    convolution_param { 
    num_output: 50 
    kernel_size: 5 
    stride: 1 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 
layer { 
    name: "pool2" 
    type: "Pooling" 
    bottom: "conv2" 
    top: "pool2" 
    pooling_param { 
    pool: MAX 
    kernel_size: 2 
    stride: 2 
    } 
} 
layer { 
    name: "ip1" 
    type: "InnerProduct" 
    bottom: "pool2" 
    top: "ip1" 
    param { 
    lr_mult: 1 
    } 
    param { 
    lr_mult: 2 
    } 
    inner_product_param { 
    num_output: 500 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 
layer { 
    name: "relu1" 
    type: "ReLU" 
    bottom: "ip1" 
    top: "ip1" 
} 
layer { 
    name: "ip2" 
    type: "InnerProduct" 
    bottom: "ip1" 
    top: "ip2" 
    param { 
    lr_mult: 1 
    } 
    param { 
    lr_mult: 2 
    } 
    inner_product_param { 
    num_output: 10 
    weight_filler { 
     type: "xavier" 
    } 
    bias_filler { 
     type: "constant" 
    } 
    } 
} 
layer { 
    name: "loss" 
    type: "Softmax" 
    bottom: "ip2" 
    top: "loss" 
}  

file_list.txt является

D:\caffe-windows\examples\mnist\test\test1.jpg 0 

И tests1.jpg что-то вроде этого

enter image description here

(черный & белый 28 * 28 изображение, сохраненное в краске, я пробовал разные размеры, но это не имеет значения, Preprocces() изменяет его в любом случае)

Для обучения сети я использую this учебник, здесь is prototxt

Так почему же он прогнозирует неправильные цифры и всегда со 100% -ной вероятностью?

(я использую Windows 7, VS13)

ответ

1

В вашем "ImageData" слой, вы должны нормализовать данные test1.jpg из [0, 255] [0, 1] по "шкале" на соблюдайте последовательность препроцессов между обучением и тестом следующим образом:

image_data_param { 
    source: "D:\\caffe-windows\\examples\\mnist\\test\\file_list.txt" 
    scale: 0.00390625 
    } 
+0

спасибо большое, он решил проблему –

Смежные вопросы