如何从PyCaffe Layer对象获取内核大小和步幅

时间:2017-05-19 00:43:29

标签: caffe pycaffe

我希望能够为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'

这很奇怪,因为我显然部分正确,因为我能够成功地进行检查,并且只尝试为卷积层提取卷积参数,因此我正确地工作。出了什么问题?当我试图看到什么样的对象"层"我看到了这个:

<caffe._caffe.Layer object at 0x7fe3a2fad050>

所以这意味着它实际上是一个PyCaffe图层对象。我到处寻找PyCaffe Layer类参考,但还没有想出任何东西。有没有人知道一个很好的参考或如何正确提取内核和步幅信息?

1 个答案:

答案 0 :(得分:2)

按照kostek的指导,我能够通过单独读取原型文本作为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)+']'