【问题标题】:How to retrieve a layer in Caffe如何在 Caffe 中检索图层
【发布时间】:2016-07-15 21:34:54
【问题描述】:

给定一个caffe.Net 对象,访问特定层的最佳方式是什么?
现在我只知道如何迭代它们,这不是很有用:

for i in range(n_layers):
  print net.layers[i].type

【问题讨论】:

  • 您究竟想通过“访问特定层”来完成什么?
  • 调试。只想检查层的一些成员变量。
  • 在这种情况下,请查看我的更新答案。

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


【解决方案1】:

您可以通过

获取所有图层的名称
all_names = [n for n in net._layer_names]

当然,如果您想检查学习参数的值,您可以在 net surgery 示例中查看它是如何完成的。

例如,如果您想检查 conv1 层的过滤器(假设您的模型中有一个具有该名称的层),您可以访问

In [1]: net.params['conv1'][0].data.shape
Out[1]: (64, 3, 3, 3)

以及这一层的偏置项

In [2]: net.params['conv1'][1].data.shape
Out[2]: (64,)

如您所见,这是图像处理网络的第一层,它有 64 个过滤器作用于 3x3 块 BGR(3 通道)输入。

如果您已经通过网络输入数据(使用 net.forwardnet.backward),您可以检查不同层对通过网络输入的特定输入的响应:

In [3]: net.blobs['conv1'].data.shape
Out[3]: (1, 64, 198, 198)

conv1 层的输出形状为 198x198 像素,64 个通道(该层有 64 个过滤器),batch size 为 1。
如果您也执行了反向传递,您还可以检查在该层计算的梯度:

In [4]: net.blobs['conv1'].diff.shape
Out[4]: (1, 64, 198, 198)

【讨论】:

  • 感谢您的努力,但我清楚地询问如何获取图层对象而不是 blob。例如。我想访问一些未暴露给 blob 的内部数据。
  • @memecs 什么内部数据?层的参数?你必须更具体。请相应地更新您的问题,您会得到更好的答案吗
  • @Shai 我有一个使用扁平层的模型。该层位于net._layer_names,但在 net.params 中找不到。我将如何访问该 Flatten 层的形状?
  • @Anton"Flatten" 层是“无参数”层,因此它没有net.params。另一方面,您可以通过net.blobs检查其输入和输出的blob形状。
【解决方案2】:

用例:

我需要在batchnorm层设置running mean和var,这不在net.paramsnet.blobs

解决方案:

net.layer_dict['bn_layer_name'].blobs[0].data 运行平均值。 blobs[1] 是 var。 blobs[2] 设置为 1,这是一个默认为 0 的比例。

如何找到它:

print(net.__dir__())然后猜一猜。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2018-01-20
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 2017-07-18
    • 2013-10-17
    • 2015-09-21
    相关资源
    最近更新 更多