假如有两个model,如何把其中一个model的某一层的权重赋给另一个model的对应层。

求问有没有现成的接口函数。自己单独写过一个cpp文件,但是编译报找不到各种头文件的错误,不知各位可否指点下如何解决。
已邀请:

ruirui_ICT - 听大大们说,要“左手代码,右手公式”,喵~

赞同来自: attitude 辛淼 李扬

用pycaffe很容易读写caffemodel,我正好手头在搞类似的,直接粘段简单代码你可以参考下
 
我下面实现的是读取一个caffemodel,然后分别把全连接层的weights打印到txt里
caffe_root = r'/home/rr/caffe-master/'
model_path = r'
/home/rr/model/lenet.caffemodel'
file_path = r'/home/rr/analysis/lenet_deploy.prototxt'
layer_list = ['ip1', 'ip2', 'ip3']
out_path = r'/home/rr/analysis/weights'

import numpy as np
import sys
sys.path.insert(0, caffe_root + 'python')
import caffe

caffe.set_mode_cpu()
net = caffe.Net(file_path, model_path, caffe.TEST)

for k, v in net.params.items():
print (k, v[0].data.shape)

for layer_name in layer_list:
weights = net.params[layer_name][0].data
fout=open(out_path+'_'+layer_name+'.txt' ,'w')
for idx1 in range(weights.shape[0]):
for idx2 in range(weights.shape[1]):
fout.write(str(weights[idx1][idx2]) + ' ')
fout.write('\n')
fout.close()

李扬 - 密码六个一

赞同来自: 孙琳钧 attitude ruirui_ICT

假设要将 source 网络的模型参数拷贝到 target 网络里
 
先初始化两个网络:
solver_source = caffe.SGDSolver('/path/to/solver_source.prototxt')
solver_target  = caffe.SGDSolver('/path/to/solver_target.prototxt')
 
然后训练 source 网络一小会
solver_source.step(100)
 
开始拷贝,如果批量拷贝多个层的参数:
solver_source.save('100.caffemodel')
solver_target.net.copy_from('100.caffemodel')
 
如果仅拷贝某一层的参数,下面的方法都行:
1. 直接对拷:
solver_target.net.params['conv1'][0].data[:] = np.copy( solver_source.net.params['conv1'][0].data[:] )
solver_target.net.params['conv1'][1].data[:] = np.copy( solver_source.net.params['conv1'][1].data[:] )
2. 通过文件中转:
import pickle
# 将参数写入到文件:
pickle.dump(solver_source.net.params['conv1'][0].data, open('params_conv1_w', 'w'))
# 从文件中读取参数:
with open('params_conv1_w', 'rb') as handle:
    params_conv1_w = pickle.loads(handle.read())
solver_target.net.params['conv1'][0].data[:] = np.copy(params_conv1_w[:])
 
除了 pickle ,np.savetxt 也能把参数存储到文件。

ChrisYann - 低级算法工程师

赞同来自: attitude

用make pycaffe生成caffe的python接口。然后可以import caffe,处理proto格式的模型,很灵活。

要回复问题请先登录注册