Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Reading network parameters from caffe .prototxt model definition in Python

I would like to read out the network parameters from a caffe network defined in a .prototxt in Python, as the layer object in the layer_dict only tell me e.g. that its a "Convolution" layer, but not things like kernel_size, strides etc. that are well defined in the .prototxt file.

So lets say I have a model.prototxt like so:

name: "Model"
layer {
  name: "data"
  type: "Input"
  top: "data"
  input_param {
    shape: {
      dim: 64
      dim: 1
      dim: 28
      dim: 28
    }
  }
}
layer {
  name: "conv2d_1"
  type: "Convolution"
  bottom: "data"
  top: "conv2d_1"
  convolution_param {
    num_output: 32
    kernel_size: 3
    stride: 1
    weight_filler {
      type: "gaussian" # initialize the filters from a Gaussian
      std: 0.01        # distribution with stdev 0.01 (default mean: 0)
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

layer {
  name: "dense_1"
  type: "InnerProduct"
  bottom: "conv2d_1"
  top: "out"
  inner_product_param {
    num_output: 1024
    weight_filler {
      type: "gaussian"
      std: 0.01
    }
    bias_filler {
      type: "constant"
      value: 0
    }
  }
}

I have found that one can parse the model like so:

from caffe.proto import caffe_pb2
import google.protobuf.text_format
net = caffe_pb2.NetParameter()
f = open('model.prototxt', 'r')
net = google.protobuf.text_format.Merge(str(f.read()), net)
f.close()

but I have no idea how to get the fields from the protobuf message out of the resulting object.

like image 954
Jarno Avatar asked Dec 03 '25 13:12

Jarno


1 Answers

You can iterate through the layers and ask about their corresponding param, e.g.:

for i in range(0, len(net.layer)):
    if net.layer[i].type == 'Convolution':
        net.layer[i].convolution_param.bias_term = True # bias term, for example

The appropriate *_param type can be found in caffe.proto, for example:

optional ConvolutionParameter convolution_param = 106
like image 72
rkellerm Avatar answered Dec 06 '25 04:12

rkellerm



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!