classificationdeep-learningcaffematcaffe

Issues regarding classification instead of regression using deep learning


I have a question. I have a network which works fine I want to do the regression. However, when I am trying to use it for classification(after maing supposedly appropriate changes) I am facing some issues. I have 9 classes, but the issue is that the network is outputting me in a way that is not clear to me. It outputs me a 9x1 vector for each object which is fine but the values inside are not probabilities. I have tried converting the softmax output to probabilities(exp(1)/(exp(1)+..+exp(n))) but to no affect . I am using caffe an matcaffe . What I want is given the input the network tells me to which class it belongs. Basically in the output I want a single value which represents my class. I am attaching my 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
}

`


Solution

  • I think the file you have uploaded is the training prototxt file. You have used SoftmaxWithLoss layer. This layer will not give you the probabilities. Replace it with SoftMax layer during deployment to get the probability of each class.