Когда у меня была незамароженная модель я без труда определял размерность входного и выходного узла графа загруженной модели вот таким образом:
using namespace std;
using namespace tensorflow;
using namespace tensorflow::ops;
cout << "Step1" << endl;
GraphDef graph_def(true);
Session* session;
SessionOptions sopt;
Status status = NewSession(sopt, &session);
if (!status.ok()) {
std::cerr << "tf error: " << status.ToString() << "\n";
}
const string export_dir = "/home/user/MyBuild/build_tftest2/models";
SavedModelBundle bundle;
RunOptions run_options;
status = LoadSavedModel(sopt, run_options, export_dir,
{kSavedModelTagServe},
&bundle);
if (!status.ok()) {
std::cerr << "tf error: " << status.ToString() << "\n";
}
else
{
GraphDef graph = bundle.meta_graph_def.graph_def();
auto shape = graph.node().Get(0).attr().at("shape").shape();
for (int i = 0; i < shape.dim_size(); i++) {
std::cout << shape.dim(i).size()<<std::endl;
}
int node_count = graph.node_size();
for (int i = 0; i < node_count; i++)
{
auto n = graph.node(i);
//graph.node(i).PrintDebugString();
cout<<"Names : "<< n.name() <<endl;
}
}
А потом я захотел модель оптимизировать и для этого её заморозил и теперь код загрузки модели уже другой,
using namespace std;
using namespace tensorflow;
using namespace tensorflow::ops;
cout << "Step1" << endl;
GraphDef graph_def(true);
Session* session;
SessionOptions sopt;
Status status = NewSession(sopt, &session);
if (!status.ok()) {
std::cerr << "tf error: " << status.ToString() << "\n";
}
cout << "Step2" << endl;
// Читаем граф
//status = ReadBinaryProto(Env::Default(), "/home/user/MyBuild/build_tftest2/models/saved_model.pb", &graph_def);
status = ReadBinaryProto(Env::Default(), "/home/user/MySoftware/foreign code/netology_JN/Diplom/Models/optimized/optim_model.pb", &graph_def);
//status = ReadBinaryProto(Env::Default(), "/home/user/MySoftware/foreign code/netology_JN/Diplom/Models/Raw/frozen_model.pb", &graph_def);
if (!status.ok()) {
std::cerr << "tf error: " << status.ToString() << "\n";
}
else
{
int node_count = graph_def.node_size();
for (int i = 0; i < node_count; i++)
{
auto n = graph_def.node(i);
//graph.node(i).PrintDebugString();
cout<<"Names : "<< n.name() <<endl;
}
auto shape = graph_def.node().Get(0).attr().at("shape").shape();
for (int i = 0; i < shape.dim_size(); i++) {
std::cout << shape.dim(0).size()<<std::endl;
}
}
Список узлов я по прежнему получаю, но при попытки получить размерность имею большой облом.
Подскажите пожалуйста как получить размерность хотябы входного и выходного узла. Я же должен знать тензоры каких размерностей надо создавать для интеграции модели в приложение.
Документации по теме нет и я буду рад любым рассуждениям, которые могут навести на путь истинный.