在python中构建自定义Caffe层

时间:2015-11-18 10:57:45

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

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

我仍然缺少的是:

  1. setup()方法:我应该在这做什么?为什么在例子中我应该比较' bottom'的长度。 param with' 2'?为什么它应该是2?它似乎不是批量大小,因为它是随意的?据我所知,底部是blob,然后第一个维度是批量大小?
  2. reshape()方法:据我了解' bottom'输入参数是下面一层的blob,' top' param是上层的blob,我需要根据我的计算的输出形状和前向传递来重塑顶层。但是,如果这些形状没有从传递到传球改变,只有重量会发生变化,为什么我需要在每次前进时都这样做?
  3. reshapeforward方法有0个索引用于' top'输入参数使用。为什么我需要使用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无效,如果它什么都不做并且还在里面循环?
  8. 对不起,如果这些问题太明显了,我就无法找到一个好的指南来理解它们并在这里寻求帮助。

2 个答案:

答案 0 :(得分:17)

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

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

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

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

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

至于propagate_down参数(Q.7):因为一个图层可能有多个bottom,原则上您需要将渐变传递给所有在backprop期间bottom。但是,对于损失图层的label底部,渐变的含义是什么?有些情况下,您不希望传播到所有 bottom:这是此标志的用途。 (这里是一个AccuracyLayer,其中包含三个bottom的丢失图层,预计会向所有这些图层倾斜。“

有关详细信息,请参阅example

答案 1 :(得分:0)

为什么它应该是2?

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

感谢。