Я пытаюсь использовать свою собственную обученную сеть со своими собственными данными из C ++. Я обучил и проверил сеть на «.jpg» данных с ImageData
слои, а затем реализовали базовый пример caffe «ification.cpp «для передачи изображений через память один за другим. В результате мне нужно знать проб для 2 классов:
1 — объект,
2 — среда.
Мой входной слой для обычных целей выглядит так:
layer {
name: "data"top: "data"top: "label"type: "Input"input_param { shape: { dim: 1 dim: 3 dim: 256 dim: 256 }}
}
Выходные слои:
layer {
name: "fc6"top: "fc6"type: "InnerProduct"bottom: "drop5"inner_product_param {
num_output: 2
weight_filler {
type: "xavier"std: 0.1
}
}
}
layer {
name: "prob"top: "prob"type: "SoftmaxWithLoss"bottom: "fc6"bottom: "label"}
layer {
name: "accuracy"top: "accuracy"type: "Accuracy"bottom: "fc6"bottom: "label"include {
phase: TEST
}
}
На этапе тестирования сеть достигла точности = 0,93, но теперь при регулярном использовании с C ++ я не могу понять какую-то базовую концепцию и получить ошибку при анализе модели.
Check failure stack trace:
...
caffe::SoftmaxWithLossLayer<>::Reshape()
caffe::Net<>::Init()
caffe::Net<>::Net()
...
Check failed: outer_num_ * inner_num_ == bottom[1]->count() (1 vs. 196608) Number of labels must match number of predictions; e.g., if softmax axis == 1 and prediction shape is (N, C, H, W), label count (number of labels) must be N*H*W, with integer values in {0, 1, ..., C-1}.
Хорошо, 1x3x256x256 = 196608, но зачем мне этот счетчик меток?
У меня есть файл «tags.txt», как в примере «ification.cpp «:
environment
object
Почему ярлыки! = Классы?
Что мне делать с SoftmaxWithLoss и входными размерами?
Вы не определили shape
для метки, я предполагаю, что у вас есть только одна метка на изображение. таким образом
layer {
name: "data"top: "data"top: "label"type: "Input"input_param { shape: { dim: 1 dim: 3 dim: 256 dim: 256 }
shape: { dim: 1 dim: 1 }} # one label per image
}
Других решений пока нет …