由于剪枝后重命名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
生成的模型会出错。
同理,对于模型融合也可以用类似的方法做。