нейронная сеть — Caffe SigmoidCrossEntropyLoss Layer Многоуровневая классификация Переполнение стека

У меня есть сеть, которая получает 2 входных изображения, и эти два изображения принадлежат более чем одному классу из 9 классов. Все примеры, которые я видел — в документации Caffe — загружают входное изображение непосредственно из prototxt, однако я передаю информацию через мой код на c ++.

Мой входной слой выглядит следующим образом

input: "data"input_shape{dim:20 dim:6 dim:100 dim:100}

input: "class_label"input_shape{dim:20 dim:9}

Слой потерь выглядит следующим образом

layer {
name: "classes"type: "InnerProduct"bottom: "ip2"top: "classes"param { lr_mult: 1 }
param { lr_mult: 2 }
inner_product_param {
num_output: 9
weight_filler {  type: "xavier" }
bias_filler { type: "constant" }
}
}layer {
name: "class_loss"type: "SigmoidCrossEntropyLoss"bottom: "classes"bottom: "class_label"top: "class_loss"}

Я предполагаю, что вход должен быть потоком, похожим на это
[0 0 1 0 1 0 1 0 0], где 1 означает, что изображения принадлежат классу, а 0 означает, что нет, это правда?

Мой второй вопрос: чего мне ожидать от вывода слоя SigmoidCrossEntropyLoss (например, SoftmaxWithLoss выводит вероятности)?

2

Решение

  1. Вы правы: метки в вашем случае должны быть двоичным 9 вектором.

  2. Выход слоя потерь является скалярным значением потерь. Вы должны ожидать, что это значение уменьшится, когда вы тренируете свою сеть. Для прогнозирования (время тестирования) вы должны заменить слой потери сигмоидальной жидкости простым слоем сигмовидной кишки. Выход некоторого сигмовидного слоя представляет собой вектор 9, причем каждая запись представляет вероятность присутствия соответствующего класса.
    Выходной слой в deploy.prototxt должен выглядеть примерно так:

    layer {
    type: "Sigmoid"name: "class_prob"bottom: "classes"top: "class_prob"}
    
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]