3

我想重塑caffemodel的卷积层的大小(这是this question的后续问题)。虽然在how to do net surgery上有教程,但它仅显示如何将一个caffemodel的权重参数复制到另一个相同大小的参数。
相反,我需要一个新的渠道(全0)添加到我的卷积过滤器,使其改变其大小从目前(64 X 3 X 3 X 3)至(64 X 4 X 3 X 3)。网络手术:如何重塑caffe中caffemodel文件的卷积层?

假定卷积层被称为'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对象。有人有想法吗?

回答

5

正如您所注意的,net.blobs不存储学习的参数/权重,而是存储在网络输入上应用过滤器/激活的结果。学习权重存储在net.params中。 (更多详情见this)。

AFAIK,你不能直接reshapenet.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) 

,因为所有的图层名称是相同的(除了conv1net4ch.params将有train.caffemodel的权重。对于第一层,现在可以手动复制相关部分:

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

最后:

net4ch.save('myNewTrainModel.caffemodel') 
+2

谢谢回答这么多问题。你真的帮了我很多!虽然未来可能还有一些问题;) – mcExchange