我应该如何在 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 向量。
- 这个 blob 是否需要遵循任何规范,例如
作为尺寸限制等?不管我的图层是什么
可以,我可以创建一个一维的 blob,并使用任何元素,一个
每个,用于层中任何计算的 blob?
- blob 的
diff
是什么意思?据我了解,bottom
的diff
是当前层的梯度,top
是上一层的梯度。但是,到底发生了什么 here?
- 这些参数什么时候训练?这是否需要在层定义中手动完成?
我看过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 进行梯度的数值测试。
我正在使用 Caffe 创建网络,我需要为其定义自己的层。我想为此使用 Python
图层。
我的层将包含一些学习参数。来自 this answer,我被告知我需要为此创建一个 blob 向量。
- 这个 blob 是否需要遵循任何规范,例如 作为尺寸限制等?不管我的图层是什么 可以,我可以创建一个一维的 blob,并使用任何元素,一个 每个,用于层中任何计算的 blob?
- blob 的
diff
是什么意思?据我了解,bottom
的diff
是当前层的梯度,top
是上一层的梯度。但是,到底发生了什么 here? - 这些参数什么时候训练?这是否需要在层定义中手动完成?
我看过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 进行梯度的数值测试。