我想做的是以下内容:
我加密了" .prototxt"和" .caffemodel"文件,因此文件不可读,参数不可见。在我的程序中,我解密文件并将结果存储为字符串。但现在我需要在我的caffe网络中设置图层。
是否有方法使用我的字符串中的参数设置caffe网络图层?对于训练有素的网络中的图层相同?与下面的源代码相当的东西(我知道这个源代码不起作用)?
shared_ptr<Net<float> > net_;
string modelString;
string trainedString;
//Decryption stuff
net_.reset(new Net<float>(modelString, TEST));
net_->CopyTrainedLayersFrom(trainedString);
非常感谢你。
答案 0 :(得分:1)
您可以使用NetParameter类的Protocol Buffer API直接初始化NetParameter类(您需要包含caffe / proto / caffe.pb.h):
bool ParseFromString(const string& data);
然后使用它来使用以下构造函数初始化Net类:
explicit Net(const NetParameter& param, const Net* root_net = NULL);
并且用于复制权重:
void CopyTrainedLayersFrom(const NetParameter& param);
重要的是要注意上述方法要求字符串变量包含二进制格式的protobuffer而不是文本格式。虽然Caffe输出的caffemodel已经是二进制格式,但你必须将prototxt文件转换为二进制格式,但是你可以使用protoc命令行程序和--encode标志来实现。
有关更多信息,我建议您查看Protocol-Buffer的网站:https://developers.google.com/protocol-buffers/
答案 1 :(得分:0)
从文本格式加载网络模型(不使用protoc进行转换)可以通过以下方式完成:
#include <google/protobuf/text_format.h>
// [...]
NetParameter net_parameter;
bool success = google::protobuf::TextFormat::ParseFromString(model, &net_parameter);
if (success){
net_parameter.mutable_state()->set_phase(TEST);
net_.reset(new Net<float>(net_parameter));
}