给定一个 caffe.Net
对象,访问特定层的最佳方式是什么?
现在我只知道如何迭代它们,这不是很有用:
for i in range(n_layers):
print net.layers[i].type
最佳答案
您可以通过以下方式获取所有图层的名称
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 个滤波器,作用于 BGR(3 channel )输入的 3x3 block 。
如果您已经通过网络馈送数据(使用 net.forward
或 net.backward
),您可以检查不同层对馈送的特定输入的响应通过网络:
In [3]: net.blobs['conv1'].data.shape
Out[3]: (1, 64, 198, 198)
conv1
层的输出形状为198x198像素,64个 channel (该层有64个滤波器),批量大小为1。
如果您也执行了向后传递,您还可以检查在这一层计算的梯度:
In [4]: net.blobs['conv1'].diff.shape
Out[4]: (1, 64, 198, 198)
关于machine-learning - 如何在 Caffe 中检索图层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36265507/