调用caffemodel中的权重赋值给自己的网络

在训练网络结构(可以打开),这个网络有两个输入,前四层两个输入各不相关,第四层会将结果链接到一起,我想问的是,对于这样的网络,使用一个已经训练好的caffemodel里面的weights参数对它进行初始化,但是已有的网络都是只有一支的,怎么才能够使得两个输入支路能够被赋值呢?
已邀请:

joshua_1988 - https://joshua19881228.github.io/

赞同来自: xinmiao jzyztzn

我以前也遇到过这样的需求,解决思路就是首先去读caffe是怎么初始化网络的,那个函数应该是CopyTrainedLayersFrom,读懂之后就自己写了一个工具。
 
工具的输入为1)目标网络的prototxt、2)源网络的prototxt、3)源网络的caffemodel、4)一个配置文件、5)目标网络的保存路径
工具的输出为目标网络的caffenet
 
输入4)配置文件中写了一些pair,比如源网络中有一层叫“conv_1”,目标网络中有“conv_1_1”和“conv_1_2”,那么就写两个pair,conv_1_1:conv_1和conv_1_2:conv_1,代表目标网络中的“conv_1_1”和“conv_1_2”都由源网络中的“conv_1”来初始化
 
大概思路就是这样,希望对你有帮助
有两种办法,
建议用第一种,若你这个用于初始化的模型生成成本不是特别高的话。
用第二种,若这模型生成成本挺高的话, 
 
用别的模型权重来初始化新模型,靠的是layer_name要一致,即老模型的layer_name对应新模型的layer_name,则网络初始化时,新的就会用老的权重值作为它的初始化值。
 
具体方法是:
1)训练两个单支的(your words)网络,只是他们的名子跟你一个两支网络上的名子分别对应。初始化时--models 一次性把两个caffemodel都传给它。
2)这种做法短平快,但需要你写点代码。需要解读caffemodel, 改掉里的layer_name,然后再save成caffemodel。然后同上。参考代码:http://nbviewer.jupyter.org/gi ... ipynb

要回复问题请先登录注册