在阅读了许多有关用Python构建Caffe层的链接后,我仍然难以理解一些概念。能否有人澄清一下?
- 关于网络的Blob和权重Python结构,在此处有解释:Finding gradient of a Caffe conv-filter with regards to input。
- 网络和求解器结构在此处有解释:Cheat sheet for caffe / pycaffe?。
- 定义Python层的示例在此处:pyloss.py on git。
- 层测试在此处:test layer on git。
- C++开发新层的说明在此处:git wiki。
我还需要了解以下内容:
setup()
方法:我应该在这里做什么?为什么在示例中,我应该将'bottom'参数的长度与'2'进行比较?为什么它应该是2?因为它是任意的,所以它似乎不是批次大小吗?而且,如果我理解正确,'bottom'就是Blob,那么第一个维度就是批次大小吗?reshape()
方法:按照我的理解,'bottom'输入参数是下一层的Blob,而'top'参数是上一层的Blob,并且我需要根据前向传递的计算输出形状来重新调整上一层。但是,如果这些形状从传递到传递不发生变化,为什么我需要每个前向传递都这样做,只有权重会改变?reshape
和forward
方法在使用“top”输入参数时具有0索引。为什么我需要使用top[0].data=...
或top[0].input=...
而不是top.data=...
和top.input=...
?这个索引是什么意思?如果我们不使用这个top列表的其他部分,为什么要以这种方式公开它?我可以怀疑它是C++底层的巧合,但最好确切地知道。reshape()
方法中的一行:if bottom[0].count != bottom[1].count
我在这里做什么?为什么它的维度再次是2?而我在这里正在计数什么?为什么blob的两个部分(0和1)都应该有相同数量的某些成员(
count
)?forward()
方法,我通过这行代码定义了什么:self.diff[...] = bottom[0].data - bottom[1].data
如果我定义了forward path后,什么时候使用它?我们能直接使用吗?
diff = bottom[0].data - bottom[1].data
这种方法中是否是出于某种目的,而不将损失分配给
self
?backward()
方法中,for i in range(2):
是什么意思?为什么范围又是2?backward()
方法中,propagate_down
参数:为什么要定义它?我的意思是,如果它是 True,那么梯度应该被分配给bottom[X].diff
,但如果它什么也不做,只是循环内部,为什么有人会调用这个方法呢?
如果这些问题太基础了,我很抱歉,我只是找不到一个好的指南来理解它们,并在这里寻求帮助。