在解析了许多关于在 Python 中构建 Caffe 层的链接之后,我仍然难以理解一些概念。可以请人澄清一下吗?
- 此处解释了网络的 Blob 和权重 Python 结构:Finding gradient of a Caffe conv-filter 关于 input。
- 网络和求解器结构在这里解释:caffe / pycaffe 的备忘单?.
- 定义 python 层的示例在这里:pyloss.py on git。
- 在这里进行层测试:在 git 上测试层。
- 此处描述了 C++ 新层的开发:git wiki。
我仍然缺少的是:
setup()
方法:我应该在这里做什么?为什么在示例中我应该将“底部”参数的长度与“2”进行比较?为什么应该是2?它似乎不是批量大小,因为它是任意的?我理解的底部是blob,然后第一个维度是批量大小?reshape()
方法:据我所知,'bottom'输入参数是下层的blob,'top'参数是上层的blob,我需要根据前向计算的输出形状重塑顶层。但是,如果这些形状在每次传球之间没有变化,只有权重发生变化,为什么我需要在每次向前传球时都这样做?reshape
和forward
方法使用 'top' 输入参数的索引为 0。为什么我需要使用top[0].data=...
ortop[0].input=...
而不是top.data=...
andtop.input=...
?这个指数是关于什么的?如果我们不使用这个顶级列表的其他部分,为什么它会以这种方式暴露出来?我可以怀疑它或 C++ 主干的巧合,但最好确切地知道。reshape()
方法,符合:if bottom[0].count != bottom[1].count
我在这里做什么?为什么它的维度又是2?我在这里算什么?为什么 blob 的两个部分(0 和 1)在某些成员的数量上应该相等(
count
)?forward()
方法,我通过这一行定义:self.diff[...] = bottom[0].data - bottom[1].data
如果我定义它,什么时候在正向路径之后使用它?我们可以使用
diff = bottom[0].data - bottom[1].data
而是在此方法的后面计算损失,而不分配给
self
,还是出于某种目的而完成?backward()
方法:这是关于什么的:for i in range(2):
?为什么范围又是2?backward()
方法、propagate_down
参数:为什么要定义?我的意思是,如果它的 True, 梯度应该分配给我所看到的,但是如果它什么都不做并且仍然在里面循环bottom[X].diff
,为什么有人会调用什么都不做的方法呢?propagate_down = False
很抱歉,如果这些问题太明显了,我只是无法找到一个很好的指南来理解它们并在这里寻求帮助。