给定一个caffe.Net
对象,访问特定层的最佳方式是什么?
现在我只知道如何迭代它们,这不是很有用:
for i in range(n_layers):
print net.layers[i].type
给定一个caffe.Net
对象,访问特定层的最佳方式是什么?
现在我只知道如何迭代它们,这不是很有用:
for i in range(n_layers):
print net.layers[i].type
您可以通过以下方式获取所有图层的名称
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.forward
或net.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)