Я пытаюсь использовать Caffe C ++ классификация пример (вот код) классифицировать изображение с помощью рукописной цифры (я тренирую свою модель в базе данных MNIST), но она всегда возвращает вероятности, например
[0, 0, 0, 1.000, 0, 0, 0, 0, 0] (1.000 can be on different position)
даже если на изображении нет номера. Я думаю, что это должно быть что-то вроде
[0.01, 0.043, ... 0.9834, ... ]
Кроме того, например, для «9», он всегда предсказывает неправильное число.
Единственное, что я изменяю в классификации.cpp, это то, что я всегда использую процессор
//#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 is
D:\caffe-windows\examples\mnist\test\test1.jpg 0
А tests1.jpg — это что-то вроде этого
(черный&белый 28 * 28 изображение сохранено в краске, я пробовал разные размеры, но это не имеет значения, Preprocces () все равно изменяет размер)
Для обучения сети я использую этот учебник, вот prototxt
Так почему же он предсказывает неправильные цифры и всегда с вероятностью 100%?
(Я использую windows 7, VS13)
В вашем слое «ImageData» вы должны нормализовать ваши данные test1.jpg с [0, 255] до [0, 1] по «шкале», чтобы сохранить согласованность метода предварительной обработки между обучением и тестированием, как показано ниже:
image_data_param {
source: "D:\\caffe-windows\\examples\\mnist\\test\\file_list.txt"scale: 0.00390625
}
Других решений пока нет …