修改prototxt文件并生成对应的caffemodel

由于剪枝后重命名layer,导致layer name过长,影响观感。
比如:

layer {
  name: "conv1_2/new/new/new/new/new/new/new/new/new/new"
  type: "Convolution"
  bottom: "conv1_1"
  top: "conv1_2"
  param {
    lr_mult: 0.0
    decay_mult: 0.0
  }
  param {
    lr_mult: 0.0
    decay_mult: 0.0
  }
  convolution_param {
    num_output: 16
    pad: 1
    kernel_size: 3
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
      value: 0.0
    }
  }
}

去掉冗余的后缀:
方法:a. 手动删除。b. 脚本。

layer {
  name: "conv1_2"
  type: "Convolution"
  bottom: "conv1_1"
  top: "conv1_2"
  param {
    lr_mult: 0.0
    decay_mult: 0.0
  }
  param {
    lr_mult: 0.0
    decay_mult: 0.0
  }
  convolution_param {
    num_output: 16
    pad: 1
    kernel_size: 3
    weight_filler {
      type: "xavier"
    }
    bias_filler {
      type: "constant"
      value: 0.0
    }
  }
}

但对于已经训练好的模型,配置的名称改了,模型肯定匹配不上了。为了匹配上,caffemodel的名字肯定也得对应修改。
修改方法:从原来的模型中读取参数,写到新的模型中,保存。

import sys
caffe_root = '/home/xx/xx/caffe/'
sys.path.insert(0, caffe_root + 'python')
import caffe

model_old = "model"
modelconfig_old = "modelconfig"
modelconfig_new = "modelconfig_new"

net_old = caffe.Net(modelconfig_old, model_old, caffe.TEST)
net_new = caffe.Net(modelconfig_new, model_old, caffe.TEST)

# rewrite proto
file = open(modelconfig_old, 'r')
file_new = open("modelconfig_new", 'w')
for line in file.readlines():
    if line.find("name") != -1 and line.find("new") != -1:
        indx = line.find("/")
        name = line[0:indx]+'"\n'
        file_new.write(name)
    else:
        file_new.write(line)

file_new.close()

#rewrite model
for layer_name, param in net_old.params.iteritems():
    indx = layer_name.find("/")
    new_name = layer_name[:indx]
    n = len(param)
    for i in range(n):
        net_new.params[new_name][i].data[...] = param[i].data[...]

net_new.save("model_new")

print "Done"

注意:

for i in range(n):
    net_new.params[new_name][i].data[...] = param[i].data[...]

这里必须迭代赋值,不能直接:

net_new.params[new_name] = param

生成的模型会出错。

同理,对于模型融合也可以用类似的方法做。

猜你喜欢

转载自blog.csdn.net/u012420309/article/details/78933874