我应该如何在 Caffe Python 层中使用 blob,它们的训练何时进行?

How should I use blobs in a Caffe Python layer, and when does their training take place?

我正在使用 Caffe 创建网络,我需要为其定义自己的层。我想为此使用 Python 图层。

我的层将包含一些学习参数。来自 this answer,我被告知我需要为此创建一个 blob 向量。

  1. 这个 blob 是否需要遵循任何规范,例如 作为尺寸限制等?不管我的图层是什么 可以,我可以创建一个一维的 blob,并使用任何元素,一个 每个,用于层中任何计算的 blob?
  2. blob 的 diff 是什么意思?据我了解,bottomdiff是当前层的梯度,top是上一层的梯度。但是,到底发生了什么 here?
  3. 这些参数什么时候训练?这是否需要在层定义中手动完成?

我看过test_python_layer.py中的例子,但大部分都没有任何参数。

您可以根据需要添加任意数量的内部参数,并且这些参数(Blob)可以具有您想要的任何形状。

要添加 Blob(在您的图层 class 中):

def setup(self, bottom, top):
  self.blobs.add_blob(2) # add two blobs
  self.blobs[0].reshape(3, 4)  # first blob is 2D
  self.blobs[0].data[...] = 0 # init 
  self.blobs[1].reshape(10)  # second blob is 1D with 10 elements
  self.blobs[1].data[...] = 1 # init to 1

每个参数的"meaning"是什么,在self.blobs中如何组织,完全由你决定。

可训练参数如何"trained"?
这是 caffe(以及其他 DNN 工具包)的一大优点,您无需担心!
你需要做什么?您只需要计算损失 w.r.t 参数的梯度并将其存储在 self.blobs[i].diff 中。更新梯度后,caffe 的内部结构会根据 gradients/learning rate/momentum/update 策略等来更新参数
所以,
必须为您的图层

设置一个重要的backward方法
backward(self, top, propagate_down, bottom):
  self.blobs[0].diff[...] = # diff of parameters
  self.blobs[1].diff[...] = # diff for all the blobs

您可能希望在完成层的实施后对其进行测试。
查看 this PR 进行梯度的数值测试。