在 OpenVINO 上使用 c++ API 为模型的每一层获取 parameters/weights
Get parameters/weights for each layer of the model using the c++ API on OpenVINO
我一直在寻找一种在 OpenVINO 框架上使用 C++ API 获取网络每一层的 weights/parameters 张量和偏差的方法。我在文档中找不到任何内容,在示例中也找不到任何示例。我怎样才能提取这些张量?
谢谢,
凯撒。
编辑:
分别获取权重和偏差的代码:
for (auto&& layer : this->pImplementation->network) {
weightsbuf << "Layer name: " << layer->name << std::endl;
weightsbuf << "Parameters:" << std::endl;
for (auto&& param : layer->params) {
weightsbuf << '\t' << param.first << ": " << param.second << std::endl;
}
std::vector<int> kernelvect;
auto kernelsize = layer->params.at("kernel");
std::stringstream ss(kernelsize);
// split by comma kernel size
for (int i; ss >> i;) {
kernelvect.push_back(i);
if (ss.peek() == ',')
ss.ignore();
}
int noutputs = std::stoi(layer->params.at("output"));
int nweights = kernelvect[0] * kernelvect[1] * noutputs;
int nbias = noutputs;
for (auto&& blob : layer->blobs) {
weightsbuf << '\t' << blob.first << ": ";
for (size_t w = 0; w < nweights; ++w) {
weightsbuf << blob.second->buffer().as<float*>()[w] << " ";
}
weightsbuf << std::endl;
weightsbuf << '\t' << "biases:";
for (size_t b = 0; b < nbias; ++b) {
weightsbuf << blob.second->buffer().as<float*>()[nweights + b] << " ";
}
}
weightsbuf << std::endl;
}
似乎没有官方示例来展示该功能。我也没有找到类似的东西。
我实现了一个基本示例,它打印有关网络每一层的信息。请看:https://github.com/ArtemSkrebkov/dldt/blob/askrebko/iterate-through-network/inference-engine/samples/cnn_network_parser/main.cpp
我相信如何使用 API 的想法很清楚。
示例基于 dldt 存储库的当前状态(分支“2019”,它对应于 2019 R3.1 版本)
另一个可能有用的 link 是关于 CNNLayer class 的文档:
https://docs.openvinotoolkit.org/latest/classInferenceEngine_1_1CNNLayer.html
我一直在寻找一种在 OpenVINO 框架上使用 C++ API 获取网络每一层的 weights/parameters 张量和偏差的方法。我在文档中找不到任何内容,在示例中也找不到任何示例。我怎样才能提取这些张量?
谢谢, 凯撒。
编辑: 分别获取权重和偏差的代码:
for (auto&& layer : this->pImplementation->network) {
weightsbuf << "Layer name: " << layer->name << std::endl;
weightsbuf << "Parameters:" << std::endl;
for (auto&& param : layer->params) {
weightsbuf << '\t' << param.first << ": " << param.second << std::endl;
}
std::vector<int> kernelvect;
auto kernelsize = layer->params.at("kernel");
std::stringstream ss(kernelsize);
// split by comma kernel size
for (int i; ss >> i;) {
kernelvect.push_back(i);
if (ss.peek() == ',')
ss.ignore();
}
int noutputs = std::stoi(layer->params.at("output"));
int nweights = kernelvect[0] * kernelvect[1] * noutputs;
int nbias = noutputs;
for (auto&& blob : layer->blobs) {
weightsbuf << '\t' << blob.first << ": ";
for (size_t w = 0; w < nweights; ++w) {
weightsbuf << blob.second->buffer().as<float*>()[w] << " ";
}
weightsbuf << std::endl;
weightsbuf << '\t' << "biases:";
for (size_t b = 0; b < nbias; ++b) {
weightsbuf << blob.second->buffer().as<float*>()[nweights + b] << " ";
}
}
weightsbuf << std::endl;
}
似乎没有官方示例来展示该功能。我也没有找到类似的东西。
我实现了一个基本示例,它打印有关网络每一层的信息。请看:https://github.com/ArtemSkrebkov/dldt/blob/askrebko/iterate-through-network/inference-engine/samples/cnn_network_parser/main.cpp
我相信如何使用 API 的想法很清楚。
示例基于 dldt 存储库的当前状态(分支“2019”,它对应于 2019 R3.1 版本)
另一个可能有用的 link 是关于 CNNLayer class 的文档: https://docs.openvinotoolkit.org/latest/classInferenceEngine_1_1CNNLayer.html