用python自定义caffe loss层

因为需要在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上的Shai,py-R-FCN的作者Orpine,以及Codebb

你可能感兴趣的:(用python自定义caffe loss层)