【发布时间】:2017-05-19 12:18:29
【问题描述】:
我希望能够为 pycaffe 网络中的每个池化层和卷积层提取所有内核大小和步幅。这似乎是可能的,因为我看到它被用于绘图功能(见第 94 行这里https://github.com/BVLC/caffe/blob/daf013931b31ed9c95250a89d09b7220badbcefe/python/caffe/draw.py)
不幸的是,当我尝试以这种方式使用此语法时:
net = caffe.Net(model_def, # defines the structure of the model
model_weights, # contains the trained weights
caffe.TEST) # use test mode (e.g., don't perform dropout)
# For each layer
for layer_name, layer in net.layer_dict.iteritems():
if layer.type == 'Convolution':
print layer.type
print layer.convolution_param.kernel_size[0] if len(layer.convolution_param.kernel_size) else 1
我收到以下错误:
Convolution
AttributeError: 'Layer' object has no attribute 'convolution_param'
这很奇怪,因为我显然部分正确,因为 layer.type 工作正常,因为我能够成功进行检查并且只尝试提取卷积层的卷积参数。出了什么问题?当我尝试查看什么样的对象“层”时,我看到了这个:
<caffe._caffe.Layer object at 0x7fe3a2fad050>
所以这意味着它实际上是一个 PyCaffe 层对象。我到处寻找 PyCaffe Layer 类参考,但没有提出任何建议。有谁知道一个好的参考或如何正确提取内核和步幅信息?
【问题讨论】:
-
在
draw.py中,我看到layer属性而不是layer_dict的循环(第153 行:for layer in caffe_net.layer)。你试过这样做吗? -
感谢您的建议。我尝试了以下操作:对于 net.layer 中的层:打印 layer.type 但收到以下错误:AttributeError: 'Net' object has no attribute 'layer'
-
好的。您无法访问这些属性,因为您通过
caffe.Net()调用拥有的对象不是drawp.py中使用的caffe.proto.caffe_pb2.NetParameter。您可能应该从 blob 中获取此信息。查看这篇博文:christopher5106.github.io/deep/learning/2015/09/04/… -
嗯,我明白了。不幸的是,我无法从 blob 中获取步幅或填充信息,因为 blob 尺寸只为我提供了输出数量和通道数量。有没有办法获得
draw.py中使用的caffe.proto.caffe_pb2.NetParameter? -
啊,我看到 net.params['conv'][0] 如何包含权重参数,从而能够获取内核大小。现在的问题是如何获得卷积步长以及池化层的内核大小和步长......