通过字符串

时间:2016-05-11 10:18:01

标签: encryption caffe

我想做的是以下内容:

我加密了" .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);

非常感谢你。

2 个答案:

答案 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));
}