Установить параметры сети кафе через строку

Я хочу сделать следующее:

Я зашифровал файл ".prototxt" и ".caffemodel", поэтому файлы не читаются и параметры не видны. Во время моей программы я расшифровываю файл и сохраняю результат в виде строки. Но теперь мне нужно установить слои в моей сети кафе.

Есть ли способ установить сетевые слои кафе с параметрами из моей строки? То же самое для слоев в обученной сети? Что-то сравнимое с исходным кодом ниже (я знаю, что этот исходный код не будет работать)?

shared_ptr<Net<float> > net_;
string modelString;
string trainedString;

//Decryption stuff

net_.reset(new Net<float>(modelString, TEST));
net_->CopyTrainedLayersFrom(trainedString);

Спасибо большое.


person Leo    schedule 11.05.2016    source источник


Ответы (2)


Вы можете инициализировать класс NetParameter напрямую, используя 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);

Важно отметить, что описанный выше метод требует, чтобы строковая переменная содержала протобуфер в двоичном формате, а не в текстовом формате. Хотя caffemodel, выдаваемый Caffe, уже находится в двоичном формате, вам также придется преобразовать файл prototxt в двоичный формат, но вы можете сделать это с помощью программы командной строки protoc в сочетании с флагом --encode.

Для получения дополнительной информации я предлагаю вам заглянуть на веб-сайт Protocol-Buffer: https://developers.google.com/protocol-buffers/

person Or Sharir    schedule 14.05.2016

Загрузить модель сети из текстового формата (без конвертации с протоколом) можно следующим образом:

#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));
}
person Elantcev Mikhail    schedule 09.08.2016