在 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可以写成文件。
我使用以下代码加载网络并设置它,层的参数存储在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可以写成文件。