2

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

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

2 回答 2

5

您可以通过以下方式获取所有图层的名称

all_names = [n for n in net._layer_names]

当然,如果您想检查学习参数的值,您可以在这个网络手术示例中看到它是如何完成的。

例如,如果您想检查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 个过滤器),批量大小为 1。
如果您也执行了反向传递,您还可以检查在该层计算的梯度:

In [4]: net.blobs['conv1'].diff.shape
Out[4]: (1, 64, 198, 198)
于 2016-03-28T15:59:15.367 回答
0

用例:

我需要在 batchnorm 层中设置运行均值和 var,它不在net.paramsornet.blobs

解决方案:

net.layer_dict['bn_layer_name'].blobs[0].data正在运行的意思。blobs[1]是 var。blobs[2]设置为 1,这是一个默认为 0 的比例。 在此处输入图像描述

我如何找到它:

print(net.__dir__())然后猜测并尝试。

于 2021-06-08T06:32:47.307 回答