首页 文章

在python中构建自定义Caffe层

提问于
浏览
18

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

我仍然缺少的是:

  • setup() 方法:我应该在这做什么?为什么在示例中我应该将'bottom' param的长度与'2'进行比较?为什么它应该是2?它似乎不是批量大小,因为它是随意的?据我所知,底部是blob,然后第一个维度是批量大小?

  • reshape() 方法:据我所知'bottom'输入参数是下层的blob,而'top'参数是上层的blob,我需要根据我的计算输出形状重新形成顶层 . 但是,如果这些形状不是从传递变为传球,只有重量变化,为什么我需要在每个前进传球中执行此操作?

  • reshapeforward 方法使用了'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 无效,如果它什么都不做而且还在里面循环?

对不起,如果这些问题太明显了,我就无法找到一个好的指南来理解它们并在这里寻求帮助 .

2 回答

  • 17

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

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

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

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

    reshape() (Q.2)开始,每次正向传递都不会调用此函数,只有在设置net以为输入/输出和参数分配空间时才会调用此函数 .
    有时,您可能希望更改网络的输入大小(例如,对于检测网络),然后您需要为网络的所有层调用 reshape() 以适应新的输入大小 .

    至于 propagate_down 参数(Q.7):由于一个层可能有多个 bottom ,原则上你需要在backprop期间将梯度传递给所有 bottom . 但是,对于损失层的底部,渐变的含义是什么?有些情况下,您不希望传播到所有 bottom :这是此标志的用途 . (这是一个带有损失层的example三个 bottom ,期望所有人的渐变) .

    有关更多信息,请参阅this "Python" layer tutorial .

  • 0

    Why it should be 2?

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

    谢谢 .

相关问题