2016-10-23 5 views
0

У меня есть вопрос. У меня есть сеть, которая отлично работает, я хочу сделать регресс. Однако, когда я пытаюсь использовать его для классификации (после того, как я предположил соответствующие изменения), я столкнулся с некоторыми проблемами. У меня 9 классов, но проблема в том, что сеть выводит меня таким образом, который мне не понятен. Он выводит мне вектор 9x1 для каждого объекта, который хорош, но значения внутри не являются вероятностями. Я попытался преобразовать вывод softmax в вероятности (exp (1)/(exp (1) + .. + exp (n))), но не влияет. Я использую caffe matcaffe . То, что я хочу, получает вход, который сеть сообщает мне, к какому классу он принадлежит. В основном на выходе я хочу одно значение, которое представляет мой класс. Я прилагаю мой prototxt file.`Вопросы, касающиеся классификации вместо регрессии с использованием глубокого обучения

name: "Zeiler_conv5" 

input: "data" 
input_dim: 1 
input_dim: 3 
input_dim: 224 
input_dim: 224 

input: "rois" 
input_dim: 1 # to be changed on-the-fly to num ROIs 
input_dim: 5 # [batch ind, x1, y1, x2, y2] zero-based indexing 
input_dim: 1 
input_dim: 1 

input: "labels" 
input_dim: 1 # to be changed on-the-fly to match num ROIs 
input_dim: 1 
input_dim: 1 
input_dim: 1 

input: "bbox_targets" 
input_dim: 1 # to be changed on-the-fly to match num ROIs 
input_dim: 84 # 4 * (K+1) (=21) classes 
input_dim: 1 
input_dim: 1 

input: "bbox_loss_weights" 
input_dim: 1 # to be changed on-the-fly to match num ROIs 
input_dim: 84 # 4 * (K+1) (=21) classes 
input_dim: 1 
input_dim: 1 

input: "angle_head" 
input_dim: 1 # to be changed on-the-fly to match num ROIs 
input_dim: 9 # 9 (-180:45:180) classes 
input_dim: 1 
input_dim: 1 

input: "angle_head_weight" 
input_dim: 1 # to be changed on-the-fly to match num ROIs 
input_dim: 9 # 9 (-180:45:180) classes 
input_dim: 1 
input_dim: 1 


layer { 
    name: "conv1" 
    type: "Convolution" 
    bottom: "data" 
    top: "conv1" 
    param { 
     lr_mult: 0.0 
    } 
    param { 
     lr_mult: 0.0 
    } 
    convolution_param { 
     num_output: 96 
     kernel_size: 7 
     pad: 3 
     stride: 2 
     weight_filler { 
      type: "gaussian" 
      std: 0.01 
     } 
     bias_filler { 
      type: "constant" 
      value: 0 
     } 
    } 
} 

layer { 
    name: "relu1" 
    type: "ReLU" 
    bottom: "conv1" 
    top: "conv1" 
} 

layer { 
    name: "norm1" 
    type: "LRN" 
    bottom: "conv1" 
    top: "norm1" 
    lrn_param { 
     local_size: 3 
     alpha: 0.00005 
     beta: 0.75 
     norm_region: WITHIN_CHANNEL 
    } 
} 

layer { 
    name: "pool1" 
    type: "Pooling" 
    bottom: "norm1" 
    top: "pool1" 
    pooling_param { 
     kernel_size: 3 
     stride: 2 
     pad: 1 
     pool: MAX 
    } 
} 

layer { 
    name: "conv2" 
    type: "Convolution" 
    bottom: "pool1" 
    top: "conv2" 
    param { 
     lr_mult: 0.0 
    } 
    param { 
     lr_mult: 0.0 
    } 
    convolution_param { 
     num_output: 256 
     kernel_size: 5 
     pad: 2 
     stride: 2 
     weight_filler { 
      type: "gaussian" 
      std: 0.01 
     } 
     bias_filler { 
      type: "constant" 
      value: 1 
     } 
    } 
} 

layer { 
    name: "relu2" 
    type: "ReLU" 
    bottom: "conv2" 
    top: "conv2" 
} 

layer { 
    name: "norm2" 
    type: "LRN" 
    bottom: "conv2" 
    top: "norm2" 
    lrn_param { 
     local_size: 3 
     alpha: 0.00005 
     beta: 0.75 
     norm_region: WITHIN_CHANNEL 
    } 
} 

layer { 
    name: "pool2" 
    type: "Pooling" 
    bottom: "norm2" 
    top: "pool2" 
    pooling_param { 
     kernel_size: 3 
     stride: 2 
     pad: 1 
     pool: MAX 
    } 
} 

layer { 
    name: "conv3" 
    type: "Convolution" 
    bottom: "pool2" 
    top: "conv3" 
    param { 
     lr_mult: 0.0 
    } 
    param { 
     lr_mult: 0.0 
    } 
    convolution_param { 
     num_output: 384 
     kernel_size: 3 
     pad: 1 
     stride: 1 
     weight_filler { 
      type: "gaussian" 
      std: 0.01 
     } 
     bias_filler { 
      type: "constant" 
      value: 0 
     } 
    } 
} 

layer { 
    name: "relu3" 
    type: "ReLU" 
    bottom: "conv3" 
    top: "conv3" 
} 

layer { 
    name: "conv4" 
    type: "Convolution" 
    bottom: "conv3" 
    top: "conv4" 
    param { 
     lr_mult: 0.0 
    } 
    param { 
     lr_mult: 0.0 
    } 
    convolution_param { 
     num_output: 384 
     kernel_size: 3 
     pad: 1 
     stride: 1 
     weight_filler { 
      type: "gaussian" 
      std: 0.01 
     } 
     bias_filler { 
      type: "constant" 
      value: 1 
     } 
    } 
} 

layer { 
    name: "relu4" 
    type: "ReLU" 
    bottom: "conv4" 
    top: "conv4" 
} 

layer { 
    name: "conv5" 
    type: "Convolution" 
    bottom: "conv4" 
    top: "conv5" 
    param { 
     lr_mult: 0.0 
    } 
    param { 
     lr_mult: 0.0 
    } 
    convolution_param { 
     num_output: 256 
     kernel_size: 3 
     pad: 1 
     stride: 1 
     weight_filler { 
      type: "gaussian" 
      std: 0.01 
     } 
     bias_filler { 
      type: "constant" 
      value: 1 
     } 
    } 
} 

layer { 
    name: "relu5" 
    type: "ReLU" 
    bottom: "conv5" 
    top: "conv5" 
} 

layer { 
    bottom: "conv5" 
    bottom: "rois" 
    top: "pool5" 
    name: "roi_pool5" 
    type: "ROIPooling" 
    roi_pooling_param { 
     pooled_w: 6 
     pooled_h: 6 
     spatial_scale: 0.0625 # (1/16) 
    } 
} 

layer { 
    bottom: "pool5" 
    top: "fc6" 
    name: "fc6" 
    param { 
     lr_mult: 1.0 
    } 
    param { 
     lr_mult: 2.0 
    } 
    type: "InnerProduct" 
    inner_product_param { 
     num_output: 4096 
    } 
} 

layer { 
    bottom: "fc6" 
    top: "fc6" 
    name: "relu6" 
    type: "ReLU" 
} 

layer { 
    bottom: "fc6" 
    top: "fc6" 
    name: "drop6" 
    type: "Dropout" 
    dropout_param { 
     dropout_ratio: 0.5 
     scale_train: false 
    } 
} 

layer { 
    bottom: "fc6" 
    top: "fc7" 
    name: "fc7" 
    param { 
     lr_mult: 1.0 
    } 
    param { 
     lr_mult: 2.0 
    } 
    type: "InnerProduct" 
    inner_product_param { 
     num_output: 4096 
    } 
} 

layer { 
    bottom: "fc7" 
    top: "fc7" 
    name: "relu7" 
    type: "ReLU" 
} 

layer { 
    bottom: "fc7" 
    top: "fc7" 
    name: "drop7" 
    type: "Dropout" 
    dropout_param { 
     dropout_ratio: 0.5 
     scale_train: false 
    } 
} 

layer { 
    bottom: "fc7" 
    top: "cls_score" 
    name: "cls_score" 
    param { 
     lr_mult: 1.0 
    } 
    param { 
     lr_mult: 2.0 
    } 
    type: "InnerProduct" 
    inner_product_param { 
     num_output: 21 
     weight_filler { 
      type: "gaussian" 
      std: 0.01 
     } 
     bias_filler { 
      type: "constant" 
      value: 0 
     } 
    } 
} 

layer { 
    bottom: "fc7" 
    top: "angle_pred" 
    name: "angle_pred" 
    type: "InnerProduct" 
    param { 
     lr_mult: 1.0 
    } 
    param { 
     lr_mult: 2.0 
    } 
    inner_product_param { 
     num_output: 9 
     weight_filler { 
      type: "gaussian" 
      std: 0.001 
     } 
     bias_filler { 
      type: "constant" 
      value: 0 
     } 
    } 
} 

layer { 
    bottom: "fc7" 
    top: "bbox_pred" 
    name: "bbox_pred" 
    type: "InnerProduct" 
    param { 
     lr_mult: 1.0 
    } 
    param { 
     lr_mult: 2.0 
    } 
    inner_product_param { 
     num_output: 84 
     weight_filler { 
      type: "gaussian" 
      std: 0.001 
     } 
     bias_filler { 
      type: "constant" 
      value: 0 
     } 
    } 
} 

layer { 
    name: "loss" 
    type: "SoftmaxWithLoss" 
    bottom: "cls_score" 
    bottom: "labels" 
    top: "loss_cls" 
    loss_weight: 0 
} 

layer { 
    name: "accuarcy" 
    type: "Accuracy" 
    bottom: "cls_score" 
    bottom: "labels" 
    top: "accuarcy" 
} 

layer { 
    name: "loss_angle" 
    type: "SmoothL1Loss" 
    bottom: "angle_pred" 
    bottom: "angle_head" 
    bottom: "angle_head_weight" 
    top: "loss_angle" 
    loss_weight: 1 
} 

layer { 
    name: "loss_bbox" 
    type: "SmoothL1Loss" 
    bottom: "bbox_pred" 
    bottom: "bbox_targets" 
    bottom: "bbox_loss_weights" 
    top: "loss_bbox" 
    loss_weight: 0 
} 

`

+0

В частности, я говорю о «angle_pred» –

ответ

0

Я думаю, что файл, который вы загрузили, является файлом прототипа обучения. Вы использовали слой SoftmaxWithLoss. Этот уровень не даст вам вероятности. Замените его слоем SoftMax во время развертывания, чтобы получить вероятность каждого класса.

+0

Просто, чтобы подтвердить «развертывание», вы имеете в виду TEST? –

+0

yeah .. test prototxt –

+0

благодарит за вашу помощь –

0

Вы использовали SoftMax функцию в выходном слое, чтобы преобразовать результаты, сгенерированные нейронной сети модели к вероятности. Теперь вам нужно учитывать максимальную вероятность, а ваш класс, связанный с максимальной вероятностью, является вашим ответом. Кстати, что вы подразумеваете под этим, функция softmax не имеет никакого эффекта? Функция Softmax также даст вам вектор, а не одно значение. Вы можете решить из вероятностей, что является последним классом, предсказанным вашим классификатором.

+0

. Я упомянул в своей постановке задачи: «Он выводит мне вектор 9x1 для каждого объекта, который хорош, но значения внутри не являются вероятностями». Значения варьируются от -180 до некоторое положительное целое число. В то время как вероятности колебаний должны колебаться между [0 1]. –

+0

Затем проверьте свою реализацию softmax. Я предполагаю, что есть некоторая ошибка, потому что не возможно, что softmax возвращает вам вектор неограниченных значений. Значения должны находиться между 0-1, потому что выражение функции softmax включает в себя нормализацию. –

+0

Хорошо, позвольте мне отлаживать. В любом случае спасибо. –

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