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

我正在尝试重塑caffe模型文件中卷积层的大小(这是这个问题的后续问题)。虽然有一个关于如何进行网络手术的教程,但它只展示了如何将权重参数从一个caffe模型复制到另一个相同大小的模型。
而我需要在我的卷积滤波器中添加一个新的通道(全部为0),以便将其大小从当前的(64x3x3x3)更改为(64x4x3x3)。

假设卷积层被称为'conv1'。这是我目前尝试过的方法:

# 加载原始网络并提取全连接层的参数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对象。有人有想法吗?


回答:

正如你所指出的,net.blobs不存储学习的参数/权重,而是存储将滤波器/激活应用于网络输入的结果。学习的权重存储在net.params中。(更多详情见这里)。

据我所知,你不能直接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) 

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

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

最后:

net4ch.save('myNewTrainModel.caffemodel')

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注