【发布时间】:2016-02-20 01:55:55
【问题描述】:
在解析了许多关于在 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()方法:我应该在这里做什么?为什么在示例中我应该将“底部”参数的长度与“2”进行比较?为什么应该是2?它似乎不是批量大小,因为它是任意的?我理解的底部是blob,然后第一个维度是批量大小? -
reshape()方法:据我所知,“底部”输入参数是下层的 blob,而“顶部”参数是上层的 blob,我需要根据前向计算的输出形状重塑顶层。但是,如果这些形状在每次传递中都没有变化,而只是权重发生变化,为什么我需要在每次前向传递中都这样做呢? -
reshape和forward方法使用 'top' 输入参数的索引为 0。为什么我需要使用top[0].data=...或top[0].input=...而不是top.data=...和top.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什么都不做的方法,如果它什么都不做并且仍然在里面循环呢?
很抱歉,如果这些问题太明显了,我只是无法找到一个好的指南来理解它们并在这里寻求帮助。
【问题讨论】:
-
不要忘记使用标志 WITH_PYTHON_LAYERS=1 制作 pycaffe,请参阅 here
标签: python neural-network deep-learning caffe pycaffe