【问题标题】:How should I use blobs in a Caffe Python layer, and when does their training take place?我应该如何在 Caffe Python 层中使用 blob,它们的训练何时进行?
【发布时间】:2017-11-09 04:07:11
【问题描述】:

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

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

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

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

【问题讨论】:

  • 一个很好的问题。

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


【解决方案1】:

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

添加 Blob(在图层的类中):

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

self.blobs 中每个参数的“含义”以及如何组织它们完全取决于您。

如何“训练”可训练参数?
这是关于 caffe(以及其他 DNN 工具包)的一项很酷的事情,您无需担心!
你需要做什么?您所需要的只是计算损失 w.r.t 参数的梯度并将其存储在self.blobs[i].diff 中。更新梯度后,caffe 的内部会根据梯度/学习率/动量/更新策略等更新参数。
所以,
必须为您的图层提供一个重要的 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 对梯度的数值测试。

【讨论】:

  • 谢谢!如果我想让一个特定的 blob 成为一个固定参数而不是学习,我可以将 diff 设置为 0 对吗?
  • @GoodDeeds 或将此 blob 的学习率设置为零。例如,参见 BatchNorm 层
  • 我收到了一个错误。我按照您的示例按照创建 blob 的方法进行操作,当我尝试访问 self.blobs[1] 时出现索引超出范围错误。如果我两次执行add_blob(1),则不会出现此类错误,但在这种情况下可能存在不同的逻辑错误。您能否说明为什么会发生这种情况?
  • @GoodDeeds 我的回答很可能是错误的。做对你有用的事!
  • 好的,谢谢。这似乎现在有效。我还运行了您在链接 PR 中编写的代码(谢谢!),我面临与this comment 相同的问题。在我的情况下,这些值也相差 2 倍。这是我的图层的问题,还是已知问题(询问是因为之前报告过)?
猜你喜欢
  • 2021-05-09
  • 2017-07-13
  • 1970-01-01
  • 2017-04-20
  • 1970-01-01
  • 2017-05-27
  • 2016-05-11
  • 2018-02-12
  • 2016-02-19
相关资源
最近更新 更多