在Caffe中动态修改图层的参数

时间:2016-11-29 05:40:35

标签: python caffe pycaffe

我使用以下代码加载网络并进行设置,图层的参数存储在deploy.prototxt

net = caffe.Net(deploy.prototxt, caffemodel, caffe.TEST)

但是,我想要做的是修改图层动态的参数(例如kernel_sizepad等),而不是修改原型文件和重装它。 有没有办法这样做?

3 个答案:

答案 0 :(得分:0)

您可以编写自己的get / set方法并将它们公开给python。 在layer.hpp中:

virtual float GetParameter(const std::string param_name) {return -1;}
virtual void SetParameter(const std::string param_name, float val) {}

然后在要动态获取/设置参数的图层中重新定义这些方法。

最后一步是将方法公开给python。在_caffe.cpp中为bp::class_<Layer...添加此内容:

.def("get_parameter", &Layer<Dtype>::GetParameter)
.def("set_parameter", &Layer<Dtype>::SetParameter)

答案 1 :(得分:0)

我建议改变你对这个问题的看法。对于你提到的“动态修改参数”,它有什么依赖?最常用的变量(我面临的)是当前的迭代次数。例如,我想每10000次减少参数值。基于此,在使用该参数的图层中,应用该函数进行修改。这与修改原型文件文件相同。

为了获得特定图层中的迭代次数,我在这里放了另一个解决方案。与修改原型文件相比,它非常简单,可能会显着降低您的工作量。希望您能从这个解决方案中获得灵感并将其应用到您的案例中。

https://stackoverflow.com/a/38386603/6591990

答案 2 :(得分:0)


[帖子末尾的解决方案]
我需要微调一个模型,因此想要以编程方式更改各个层的 lr_mult 参数。我从这个主题的标题开始寻求帮助,谢天谢地在下面提到的标题为“如何以编程方式修改原型文件?”的链接中结束。
https://github.com/BVLC/caffe/issues/4878
在text_format中的google / protobuf中加载模型定义原型文件后,可以访问和修改参数。修改过的protobuf可以写成文件。