我试图重塑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
对象。有没有人有想法?
答案 0 :(得分:6)
如您所知,net.blobs
不存储学习的参数/权重,而是存储在网络输入上应用过滤器/激活的结果。学习的权重存储在net.params
中。 (有关详细信息,请参阅this。)
AFAIK,您无法直接reshape
net.params
添加频道
您可以做的是,有两个网deploy_trained_net_with_3ch.prototxt
和deploy_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')