【问题标题】:How to get kernel size and stride from PyCaffe Layer object如何从 PyCaffe Layer 对象中获取内核大小和步幅
【发布时间】: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] 如何包含权重参数,从而能够获取内核大小。现在的问题是如何获得卷积步长以及池化层的内核大小和步长......

标签: caffe pycaffe


【解决方案1】:

按照 kostek 的指导,我能够通过单独读取 prototxt 作为caffe.proto.caffe_pb2.NetParameter 来提取我想要的参数。执行此操作的代码如下:

from caffe.proto import caffe_pb2
from google.protobuf import text_format

new_format_model_def = '/models/vgg16-caffe/new_format_VGG_ILSVRC_16_layers_deploy.prototxt'
parsible_net = caffe_pb2.NetParameter()
text_format.Merge(open(new_format_model_def).read(), parsible_net)
print parsible_net.layer

print '[kernel, stride, pad]'
for layer in parsible_net.layer:
    if layer.type == 'Convolution':
          print '======='
          print layer.name
          kernel = layer.convolution_param.kernel_size[0] if len(layer.convolution_param.kernel_size) else 1
          stride = layer.convolution_param.stride[0] if len(layer.convolution_param.stride) else 1
          pad    = layer.convolution_param.pad[0] if len(layer.convolution_param.pad) else 0
          print '['+str(kernel)+str(stride)+str(pad)+']'
    if layer.type == 'Pooling':
          print '======='
          print layer.name
          kernel = layer.pooling_param.kernel_size
          stride = layer.pooling_param.stride
          pad    = layer.pooling_param.pad
          print '['+str(kernel)+str(stride)+str(pad)+']'

【讨论】:

    猜你喜欢
    • 2019-04-23
    • 2020-10-12
    • 2021-08-20
    • 2010-10-10
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2010-11-24
    相关资源
    最近更新 更多