18

在解析了许多关于在 Python 中构建 Caffe 层的链接之后,我仍然难以理解一些概念。可以请人澄清一下吗?

我仍然缺少的是:

  1. setup()方法:我应该在这里做什么?为什么在示例中我应该将“底部”参数的长度与“2”进行比较?为什么应该是2?它似乎不是批量大小,因为它是任意的?我理解的底部是blob,然后第一个维度是批量大小?
  2. reshape()方法:据我所知,'bottom'输入参数是下层的blob,'top'参数是上层的blob,我需要根据前向计算的输出形状重塑顶层。但是,如果这些形状在每次传球之间没有变化,只有权重发生变化,为什么我需要在每次向前传球时都这样做?
  3. reshapeforward方法使用 'top' 输入参数的索引为 0。为什么我需要使用top[0].data=...ortop[0].input=...而不是top.data=...and top.input=...?这个指数是关于什么的?如果我们不使用这个顶级列表的其他部分,为什么它会以这种方式暴露出来?我可以怀疑它或 C++ 主干的巧合,但最好确切地知道。
  4. reshape()方法,符合:

    if bottom[0].count != bottom[1].count
    

    我在这里做什么?为什么它的维度又是2?我在这里算什么?为什么 blob 的两个部分(0 和 1)在某些成员的数量上应该相等(count)?

  5. forward()方法,我通过这一行定义:

    self.diff[...] = bottom[0].data - bottom[1].data
    

    如果我定义它,什么时候在正向路径之后使用它?我们可以使用

    diff = bottom[0].data - bottom[1].data 
    

    而是在此方法的后面计算损失,而不分配给self,还是出于某种目的而完成?

  6. backward()方法:这是关于什么的:for i in range(2):?为什么范围又是2?

  7. backward()方法、propagate_down参数:为什么要定义?我的意思是,如果它的 True, 梯度应该分配给我所看到的,但是如果它什么都不做并且仍然在里面循环bottom[X].diff,为什么有人会调用什么都不做的方法呢?propagate_down = False

很抱歉,如果这些问题太明显了,我只是无法找到一个很好的指南来理解它们并在这里寻求帮助。

4

2 回答 2

17

你在这里问了很多问题,我会给你一些亮点和建议,希望能为你澄清问题。我不会明确回答你所有的问题。

您似乎对 blob 和层的输入/输出之间的区别感到最困惑。事实上,大多数层都有一个blob作为输入,一个blob作为输出,但情况并非总是如此。考虑一个损失层:它有两个输入:预测和真实标签。因此,在这种情况下,bottom是一个长度为2 (!)的向量,bottom[0]它是一个 (4-D) 表示预测的 blob,而bottom[1]另一个带有标签的 blob。因此,在构建这样一个层时,您必须确定您有(硬编码)2 个输入 blob(参见例如ExactNumBottomBlobs()定义AccuracyLayer)。

blob 也是如此top:确实在大多数情况下top,每一层都有一个,但并非总是如此(参见例如AccuracyLayer)。因此,top也是一个4-D blob 的向量,每个top层一个。大多数情况下,该向量中只有一个元素,但有时您可能会发现不止一个。

我相信这涵盖了您的问题 1、3、4 和 6。

reshape()(Q.2) 开始,该函数不会在每个前向传递中调用,它仅在设置 net 为输入/输出和参数分配空间时调用。
有时,您可能想要更改网络的输入大小(例如,检测网络),然后您需要调用reshape()网络的所有层以适应新的输入大小。

至于propagate_down参数(Q.7):由于一个层可能有多个层bottom,原则上您需要在反向传播期间将梯度传递给所有 bottoms。label但是,梯度到损失层底部的含义是什么?在某些情况下,您不想传播到所有 bottoms:这就是这个标志的用途。(这里有一个损失层的例子bottom,其中三个s 期望对所有这些都有梯度)。

有关详细信息,请参阅"Python"层教程

于 2015-11-19T06:56:26.653 回答
0

为什么应该是2?

那个具体的要点是关于欧几里得损失层。欧几里得损失是2 个向量之间的均方误差。因此,该层的输入 blob 中必须有 2 个向量。每个向量的长度必须相同,因为它是逐元素的差异。您可以在reshape方法中看到此检查。

谢谢。

于 2016-04-02T05:42:12.537 回答