美文网首页CNN
用python自定义caffe loss层

用python自定义caffe loss层

作者: kelseyh | 来源:发表于2017-03-20 21:59 被阅读1137次

    因为需要在faster-rcnn中再加入一个loss项,所以需要自己写loss层。对C++和cuda都不熟悉,而且用caffe提供的python接口写会非常方便,所以选择用python来写(python写的caffe层并不支持多个gpu并行计算,不过反正我也没有多个gpu,只有一个,所以就没啥关系)

    1. pycaffe loss layer的结构

    import caffe

    class MyLossLayer(caffe.layer):

        def setup(self, bottom, top):

            # get the param_str from self 

        def reshape(self, bottom, top):

            # reshape the top

        def forward(self, bottom, top):

            # feed forward from bottom to top

        def backward(self, top, propagate_down, bottom):

            # back forward from top to bottom

    以上这4个方法是必须定义在里面的。

    2. 一些必须的东西

    reshape函数中里面必须把top的shape给定下来,比如说,这是一个loss layer,那么这个层的输出就是一个loss值,所以这个top的shape就是1*1,所以就这样写:

    top[0].reshape(1,1)

    forward函数中最后的结果要放入top[i].data[...]中,其中i就是第几个top,因为有些层会有多个输出的。在loss layer中就只有一个输出就是loss值,所以只要给top[0].data[...]赋值就行了:

    top[0].data[...] = some_value_you_get

    backward函数中,是对输入这一层的数据求梯度,而不是输出这一层的数据。即是对bottom求梯度,不是对top求梯度,所以这样写:

    bottom[0].diff[...] = some_gradients_you_get

    3. 一些知识点

    setup和reshape是在caffe构造网络结构的时候调用的,这个时候bottom[I].data的shape显示应该是1 * size的,因为这个时候并不知道batch_size是多少。

    forward和backward是在train阶段调用的,这个时候bottom[I].data的shape显示的就是batch_size * size的了。

    4. 感谢

    在对caffe和python都不熟悉的情况下,把基础的一些搭建pycaffe loss layer的方法搞明白了,要感谢下StackOverflow上的Shaipy-R-FCN的作者Orpine,以及Codebb

    相关文章

      网友评论

      • a40eda1fc5cf:在backward函数中一定要先手动算好loss的梯度公式吗,如果我的loss公式很复杂,caffe不能像Torch或TensorFlow一样自动计算梯度?
        kelseyh:@她男朋友 只要计算这一层的梯度公式就可以了,每一层的梯度得自己写。
      • 雪之音:python在神经网络之类用的蛮多的,我们大一的入门语言就是Python,后来不怎么用到,一直小瞧了
        BetterCV:我使用python自定义loss时候,发现需要明确指定loss_weight:1,否则反向传播不起作用
        kelseyh:@雪之音 哈哈,是的呀~

      本文标题:用python自定义caffe loss层

      本文链接:https://www.haomeiwen.com/subject/jnginttx.html