网络手术:如何重塑caffe中caffemodel文件的卷积层?

时间:2016-10-06 14:09:31

标签: machine-learning neural-network deep-learning caffe pycaffe

我试图重塑caffemodel的卷积层的大小(这是this question的后续问题)。虽然有how to do net surgery的教程,但它只显示了如何将权重参数从一个caffemodel复制到另一个相同大小的caffemodel。 相反,我需要将新频道(全部为0)添加到我的卷积滤镜中,以便将其大小从当前(64 x 3 x 3 x 3)更改为(64 X 4 X 3 X 3)。

假设卷积层被称为'conv1'。这是我到目前为止所尝试的:

# Load the original network and extract the fully connected layers' parameters.
net = caffe.Net('../models/train.prototxt', 
                '../models/train.caffemodel', 
                caffe.TRAIN)

现在我可以执行此操作:

net.blobs['conv1'].reshape(64,4,3,3);
net.save('myNewTrainModel.caffemodel');

但保存的模型似乎没有改变。我已经读过卷积的实际权重存储在net.params['conv1'][0].data而不是net.blobs,但我无法弄清楚如何重塑net.params对象。有没有人有想法?

1 个答案:

答案 0 :(得分:6)

如您所知,net.blobs不存储学习的参数/权重,而是存储在网络输入上应用过滤器/激活的结果。学习的权重存储在net.params中。 (有关详细信息,请参阅this。)

AFAIK,您无法直接reshape net.params添加频道 您可以做的是,有两个网deploy_trained_net_with_3ch.prototxtdeploy_empty_net_with_4ch.prototxt。除输入形状定义和第一层名称外,这两个文件几乎相同 然后你可以将两个网加载到python并复制相关部分:

net3ch = caffe.Net('deploy_trained_net_with_3ch.prototxt', 'train.caffemodel', caffe.TEST) 
net4ch = caffe.Net('deploy_empty_net_with_4ch.prototxt', 'train.caffemodel', caffe.TEST) 

由于所有图层名称都相同(conv1除外)net4ch.params的权重为train.caffemodel。至于第一层,您现在可以手动复制相关部分:

net4ch.params['conv1_4ch'][0].data[:,:3,:,:] = net3ch.params['conv1'][0].data[...]

最后:

net4ch.save('myNewTrainModel.caffemodel')