我希望能够为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类参考,但还没有想出任何东西。有没有人知道一个很好的参考或如何正确提取内核和步幅信息?
答案 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)+']'