在 Caffe 中动态修改层的参数

Dynamically modify layer's parameters in Caffe

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

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

但是,我想做的是动态修改层的参数(例如kernel_size,或pad等),而不是修改 prototxt 文件并重新加载它。 有什么办法吗?

您可以编写自己的 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) {}

然后在您想要动态 get/set 参数的图层中重新定义这些方法。

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

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

我建议您改变对这个问题的看法。你提到的"dynamically modified parameter"取决于什么?最常用的变量(我面对的)是当前迭代时间。例如我想每 10000 次减少参数值。基于此,在您使用该参数的层中,应用该函数对其进行修改。这和修改prototxt文件是一样的。

为了得到特定层的迭代次数,我只是把别人的解决方案放在这里。它非常简单,与修改 prototxt 文件相比可能会显着减少您的工作量。希望您能从这个解决方案中得到启发并将其应用到您的案例中。


[解完了post]
我需要微调模型,因此想以编程方式更改各个层的 lr_mult 参数。我的帮助搜索是从该线程的标题开始的,幸运的是在下面提到的标题为 'How to modify a prototxt programmatically?' 的 link 中结束。
https://github.com/BVLC/caffe/issues/4878
在text_format中加载google/protobuf中的模型定义prototxt文件后可以访问和修改参数。修改后的protobuf可以写成文件。