caffe学习小问题(1):caffe中的Accuracy

    xiaoxiao2022-07-12  147

    今天才偶然发现,caffe在计算Accuravy时,利用的是最后一个全链接层的输出(不带有acitvation function),比如:alexnet的train_val.prototxt、caffenet的train_val.prototxt

    下图是这两个网络训练配置文件(prototxt文件)计算Accuray的配置文件截图的截图(对于该部分,alexnet和caffenet是一致的)

    最后一个全连接层 layer {   name: "fc8"   type: "InnerProduct"   bottom: "fc7"   top: "fc8"   param {     lr_mult: 1     decay_mult: 1   }   param {     lr_mult: 2     decay_mult: 0   }   inner_product_param {     num_output: 1000     weight_filler {       type: "gaussian"       std: 0.01     }     bias_filler {       type: "constant"       value: 0     }   } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 计算Accuracy layer {   name: "accuracy"   type: "Accuracy"   bottom: "fc8"   bottom: "label"   top: "accuracy"   include {     phase: TEST   } } 1 2 3 4 5 6 7 8 9 10 可以看到,caffe中计算Accuracy时,是通过比较最后一个全连接层(神经元个数=类别数、但没有加入activation function)的输出和数据集的labels来得到的,计算过程在AccuracyLayer中实现

    之前一直非常困惑,计算accuracy应该使用计算得到的labels与数据集真正的labels去做计算,为什么caffe的accuracy要将fc8接入Accuray层呢?通过简单查看AccuracyLayer的说明才发现,原来,在AccuracyLayer内部,实现了“利用fc8的输出得到数据集的预测labels”(数值最大的那个值得idnex就是样本的类别),那么,再与输入的数据集真实lebels作对比,就实现了accuray的计算!

    实际上,如果仅仅是做预测,利用fc8的输出就够了(输出值最大的那个位置即为输入的label),该输出表示了输入的样本属于每一类的可能性大小,但并不是概率值;  如果为了使输出具有统计意义,需要加入softmax function,它只是使前面的全连接层的输出(fc8)具有了概率意义,并不改变这些输出之前的大小关系,因为softmax function本身就是增函数;  为了利用误差反向传播,还需要构造loss function,需要利用softmax function的输出,即需要利用输入样本属于每一类的概率值;

    注意:

    最后一个全连接层(fc8)的输出值位于区间[−∞,∞][−∞,∞],它并不是概率值

    fc8后面接的SoftmaxWithLoss层做的工作分2步

    第一步:对fc8的输出计算softmax function(结果为概率值) 第二步:利用求得的概率值计算Loss值 ---------------------  作者:tina_ttl  来源:  原文:https://blog.csdn.net/tina_ttl/article/details/51556620  版权声明:本文为博主原创文章,转载请附上博文链接!

    最新回复(0)