在python中构建自定义Caffe层

lok*_*nar 18 python neural-network deep-learning caffe pycaffe

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

我仍然缺少的是:

  1. setup()方法:我应该在这做什么?为什么在例子中我应该将'底部'参数的长度与'2'进行比较?为什么它应该是2?它似乎不是批量大小,因为它是随意的?据我所知,底部是blob,然后第一个维度是批量大小?
  2. reshape()方法:据我所知'底部'输入参数是下层的blob,'top'参数是上层的blob,我需要根据我的计算的输出形状重新形成顶层.但是,如果这些形状不是从传递变为传球,只有重量变化,为什么我需要在每个前进传球中执行此操作?
  3. reshapeforward方法有0个索引用于'top'输入param使用.为什么我需要使用top[0].data=...top[0].input=...代替top.data=...top.input=...?这个指数怎么样?如果我们不使用此顶级列表的其他部分,为什么以这种方式暴露它?我可以怀疑它或C++骨干的巧合,但确切地知道它会很好.
  4. reshape() 方法,符合:

    if bottom[0].count != bottom[1].count
    
    Run Code Online (Sandbox Code Playgroud)

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

  5. forward() 我用这条线定义的方法:

    self.diff[...] = bottom[0].data - bottom[1].data
    
    Run Code Online (Sandbox Code Playgroud)

    如果我定义它,在前进路径后使用它?我们可以使用吗?

    diff = bottom[0].data - bottom[1].data 
    
    Run Code Online (Sandbox Code Playgroud)

    相反,在这个方法中稍后计算损失,而不是分配self,或者是为了某种目的而完成的?

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

  7. backward()方法,propagate_down参数:为什么定义?我的意思是,如果它的真实,渐变应该分配给bottom[X].diff我所看到的,但是为什么有人会调用什么都不会做的方法propagate_down = False,如果它什么都不做而且还在里面循环?

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

Sha*_*hai 17

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

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

这同样适用于top斑点和:确实是在大多数情况下,有一个单一的top每一层,但它并非总是如此(见例如AccuracyLayer).因此,top也是4-D blob 的向量,每个top层对应一个.大多数情况下,该向量中只有一个元素,但有时您可能会找到多个元素.

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

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

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

有关更多信息,请参阅"Python"图层教程.