36#include <tensorflow/cc/saved_model/loader.h>
37#include <tensorflow/cc/saved_model/tag_constants.h>
44namespace tf = tensorflow;
58 const std::string& dir,
const bool allow_growth =
true,
59 const double per_process_gpu_memory_fraction = 0,
60 const std::string& visible_device_list =
"") {
62 tf::SavedModelBundleLite saved_model;
64 allow_growth, per_process_gpu_memory_fraction, visible_device_list);
66 tf::LoadSavedModel(session_options, tf::RunOptions(), dir,
67 {tf::kSavedModelTagServe}, &saved_model);
69 throw std::runtime_error(
"Failed to load SavedModel: " + status.ToString());
86 const std::string& dir,
const bool allow_growth =
true,
87 const double per_process_gpu_memory_fraction = 0,
88 const std::string& visible_device_list =
"") {
91 dir, allow_growth, per_process_gpu_memory_fraction, visible_device_list);
92 tf::Session* session = saved_model.GetSession();
106 const tf::SavedModelBundleLite& saved_model) {
108 return saved_model.GetSession();
125 const tf::SavedModelBundleLite& saved_model,
const std::string& layer_name,
126 const std::string& signature =
"serving_default") {
128 std::string node_name;
129 const tf::SignatureDef& model_def = saved_model.GetSignatures().at(signature);
130 auto inputs = model_def.inputs();
131 auto outputs = model_def.outputs();
132 auto& nodes = inputs;
133 nodes.insert(outputs.begin(), outputs.end());
134 for (
const auto& node : nodes) {
135 const std::string& key = node.first;
136 const tf::TensorInfo& info = node.second;
137 if (key == layer_name) {
138 node_name = info.name();
160 const tf::SavedModelBundleLite& saved_model,
const std::string& node_name,
161 const std::string& signature =
"serving_default") {
163 std::string layer_name;
164 const tf::SignatureDef& model_def = saved_model.GetSignatures().at(signature);
165 auto inputs = model_def.inputs();
166 auto outputs = model_def.outputs();
167 auto& nodes = inputs;
168 nodes.insert(outputs.begin(), outputs.end());
169 for (
const auto& node : nodes) {
170 const std::string& key = node.first;
171 const tf::TensorInfo& info = node.second;
172 if (info.name() == node_name) {
199 const tf::SavedModelBundleLite& saved_model,
const bool layer_names =
false,
200 const std::string& signature =
"serving_default") {
202 std::vector<std::string> names;
203 const tf::SignatureDef& model_def = saved_model.GetSignatures().at(signature);
204 for (
const auto& node : model_def.inputs()) {
205 const std::string& key = node.first;
206 const tf::TensorInfo& info = node.second;
207 names.push_back(info.name());
209 std::sort(names.begin(), names.end());
212 std::vector<std::string> node_names = names;
214 for (
const auto& node_name : node_names)
240 const tf::SavedModelBundleLite& saved_model,
const bool layer_names =
false,
241 const std::string& signature =
"serving_default") {
243 std::vector<std::string> names;
244 const tf::SignatureDef& model_def = saved_model.GetSignatures().at(signature);
245 for (
const auto& node : model_def.outputs()) {
246 const std::string& key = node.first;
247 const tf::TensorInfo& info = node.second;
248 names.push_back(info.name());
250 std::sort(names.begin(), names.end());
253 std::vector<std::string> node_names = names;
255 for (
const auto& node_name : node_names)
274 const tf::SavedModelBundleLite& saved_model,
const std::string& node_name,
275 const std::string& signature =
"serving_default") {
277 std::vector<int> node_shape;
278 const tf::SignatureDef& model_def = saved_model.GetSignatures().at(signature);
279 auto inputs = model_def.inputs();
280 auto outputs = model_def.outputs();
281 auto& nodes = inputs;
282 nodes.insert(outputs.begin(), outputs.end());
283 for (
const auto& node : nodes) {
284 const std::string& key = node.first;
285 const tf::TensorInfo& info = node.second;
286 if (info.name() == node_name) {
287 const auto& shape = info.tensor_shape();
288 for (
int d = 0; d < shape.dim_size(); d++)
289 node_shape.push_back(shape.dim(d).size());
308 const tf::SavedModelBundleLite& saved_model,
const std::string& node_name,
309 const std::string& signature =
"serving_default") {
311 tf::DataType type = tf::DT_INVALID;
312 const tf::SignatureDef& model_def = saved_model.GetSignatures().at(signature);
313 auto inputs = model_def.inputs();
314 auto outputs = model_def.outputs();
315 auto& nodes = inputs;
316 nodes.insert(outputs.begin(), outputs.end());
317 for (
const auto& node : nodes) {
318 const std::string& key = node.first;
319 const tf::TensorInfo& info = node.second;
320 if (info.name() == node_name) {
341 const tf::SavedModelBundleLite& saved_model) {
343 std::stringstream ss;
344 ss <<
"SavedModel Info:" << std::endl;
346 ss <<
"Signatures:" << std::endl;
347 const auto& signatures = saved_model.GetSignatures();
348 for (
const auto& sig : signatures) {
350 ss <<
" " << sig.first << std::endl;
351 const auto& def = sig.second;
353 ss <<
" Inputs: " << def.inputs_size() << std::endl;
354 for (
const auto& node : def.inputs()) {
355 ss <<
" " << node.first <<
": " << node.second.name() << std::endl;
357 for (
int d = 0; d < node.second.tensor_shape().dim_size(); d++) {
358 ss << node.second.tensor_shape().dim(d).size() <<
", ";
360 ss <<
"]" << std::endl;
361 ss <<
" DataType: " << tf::DataTypeString(node.second.dtype())
365 ss <<
" Outputs: " << def.outputs_size() << std::endl;
366 for (
const auto& node : def.outputs()) {
367 ss <<
" " << node.first <<
": " << node.second.name() << std::endl;
369 for (
int d = 0; d < node.second.tensor_shape().dim_size(); d++) {
370 ss << node.second.tensor_shape().dim(d).size() <<
", ";
372 ss <<
"]" << std::endl;
373 ss <<
" DataType: " << tf::DataTypeString(node.second.dtype())
Namespace for tensorflow_cpp library.
tf::Session * getSessionFromSavedModel(const tf::SavedModelBundleLite &saved_model)
Returns the session that a SavedModel is loaded in.
tf::Session * loadSavedModelIntoNewSession(const std::string &dir, const bool allow_growth=true, const double per_process_gpu_memory_fraction=0, const std::string &visible_device_list="")
Loads a TensorFlow SavedModel from a directory into a new session.
tf::SavedModelBundleLite loadSavedModel(const std::string &dir, const bool allow_growth=true, const double per_process_gpu_memory_fraction=0, const std::string &visible_device_list="")
Loads a TensorFlow SavedModel from a directory into a new session.
std::string getSavedModelNodeByLayerName(const tf::SavedModelBundleLite &saved_model, const std::string &layer_name, const std::string &signature="serving_default")
Determines the node name from a SavedModel layer name.
std::vector< std::string > getSavedModelInputNames(const tf::SavedModelBundleLite &saved_model, const bool layer_names=false, const std::string &signature="serving_default")
Determines the names of the SavedModel input nodes.
std::string getSavedModelInfoString(const tf::SavedModelBundleLite &saved_model)
tf::DataType getSavedModelNodeType(const tf::SavedModelBundleLite &saved_model, const std::string &node_name, const std::string &signature="serving_default")
Determines the datatype of a given SavedModel node.
std::vector< std::string > getSavedModelOutputNames(const tf::SavedModelBundleLite &saved_model, const bool layer_names=false, const std::string &signature="serving_default")
Determines the names of the SavedModel output nodes.
tf::SessionOptions makeSessionOptions(const bool allow_growth=true, const double per_process_gpu_memory_fraction=0, const std::string &visible_device_list="")
Helps to quickly create SessionOptions.
std::string getSavedModelLayerByNodeName(const tf::SavedModelBundleLite &saved_model, const std::string &node_name, const std::string &signature="serving_default")
Determines the layer name from a SavedModel node name.
std::vector< int > getSavedModelNodeShape(const tf::SavedModelBundleLite &saved_model, const std::string &node_name, const std::string &signature="serving_default")
Determines the shape of a given SavedModel node.
Utility functions for TensorFlow backend.