【问题标题】:Net surgery: How to reshape a convolution layer of a caffemodel file in caffe?网外科:如何在caffe中reshape一个caffemodel文件的卷积层?
【发布时间】:2017-02-15 08:01:32
【问题描述】:

我正在尝试重塑 caffemodel 的卷积层的大小(这是this question 的后续问题)。虽然how to do net surgery 上有教程,但它只展示了如何将权重参数从一个 caffemodel 复制到另一个相同大小的模型。
相反,我需要在我的卷积滤波器中添加一个新通道(全为 0),使其大小从当前的 (64x3x3x3) 更改为 (64x4 x3x3)。

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

【问题讨论】:

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


    【解决方案1】:

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

    AFAIK,您不能直接 reshape net.params 并添加频道。
    你可以做的是有两个网deploy_trained_net_with_3ch.prototxtdeploy_empty_net_with_4ch.prototxt。除了输入的形状定义和第一层的名称之外,这两个文件几乎可以相同。
    然后您可以将 both 网络加载到 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')
    

    【讨论】:

    • 感谢您回答这么多问题。你真的帮了我很多!不过将来可能还有一些问题;)
    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 2018-01-26
    • 2016-11-13
    • 2018-08-20
    • 2017-04-30
    • 2017-11-28
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多