【问题标题】:Building custom Caffe layer in python在 python 中构建自定义 Caffe 层
【发布时间】:2016-02-20 01:55:55
【问题描述】:

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

我仍然缺少的是:

  1. setup() 方法:我应该在这里做什么?为什么在示例中我应该将“底部”参数的长度与“2”进行比较?为什么应该是2?它似乎不是批量大小,因为它是任意的?我理解的底部是blob,然后第一个维度是批量大小?
  2. reshape() 方法:据我所知,“底部”输入参数是下层的 blob,而“顶部”参数是上层的 blob,我需要根据前向计算的输出形状重塑顶层。但是,如果这些形状在每次传递中都没有变化,而只是权重发生变化,为什么我需要在每次前向传递中都这样做呢?
  3. reshapeforward 方法使用 'top' 输入参数的索引为 0。为什么我需要使用top[0].data=...top[0].input=... 而不是top.data=...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 什么都不做的方法,如果它什么都不做并且仍然在里面循环呢?

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

【问题讨论】:

  • 不要忘记使用标志 WITH_PYTHON_LAYERS=1 制作 pycaffe,请参阅 here

标签: python neural-network deep-learning caffe pycaffe


【解决方案1】:

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

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

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

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

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

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

有关详细信息,请参阅this "Python" layer tutorial

【讨论】:

  • 谢谢你,Shai,现在这更有意义了。
【解决方案2】:

为什么应该是 2?

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

谢谢。

【讨论】:

  • 这应该是评论
猜你喜欢
  • 1970-01-01
  • 2018-08-17
  • 2017-04-30
  • 2017-11-29
  • 2017-01-20
  • 2017-11-24
  • 2018-04-04
  • 2023-01-04
  • 2018-01-20
相关资源
最近更新 更多