最近在Re-ID任务中有不少网络都是sharing weights的。一般都是有一个已经训练好的模型比如resnet-50,然后自己造的主网络都是有几个resnet-50的分支的,而每个分支的卷积层权重又是共享的,caffe是怎样处理的呢?
经过一番折腾,终于整明白了,其实很简单。
首先定位到caffe.proto,LayerParameter中有这样一项
repeated ParamSpec param = 6;
也就是设置每层参数学习率,正则化因子的参数。然后找到ParamSpec的定义,其中有这样一项
// The names of the parameter blobs -- useful for sharing parameters among
// layers, but never required otherwise. To share a parameter between two
// layers, give it a (non-empty) name.
optional string name = 1;
说的就是如果指定参数blob名字的话,则不同的层可以指向同一个blob,也就达到了shar