Импорт модели из Python, которая использует конвейер данных (набор данных) в Tensoflow C++
Это не вопрос, а решение проблемы, с которой я столкнулся. например, у вас есть следующий код
#placeholder
handle = tf.placeholder(tf.string, shape=[], name="handle_plc")
data_plc = tf.placeholder(tf.float32, [None] + list(data_shape[1:]), name="data_input")
label_plc = tf.placeholder(tf.float32, [None] + list(label_shape[1:]), name="label_input")
train_flag_plc = tf.placeholder(tf.bool, [None] + list(train_flag_shape[1:]), name="train_flag_input")
#data pipeline
tensor_placeholder = (data_plc, label_plc, train_flag_plc)
dataset_dummy = tf.data.Dataset.from_tensor_slices(tensor_placeholder)
dataset_dummy = dataset_dummy.batch(self.batch_size)
iterator = tf.data.Iterator.from_string_handle(handle, dataset_dummy.output_types,
dataset_dummy.output_shapes)
data_input, label_input, train_flag_input = iterator.get_next()
#neural network
logits, network = model(data_input, train_flag_input)
logits = tf.identity(logits, name="logits_output")
softmax = tf.nn.softmax(logits, name="softmax_output")
#saving the model
builder = tf.saved_model.builder.SavedModelBuilder("/model")
builder.add_meta_graph_and_variables(sess=sess, tags=[tf.saved_model.tag_constants.SERVING])
builder.save(as_text=True)
#importing in c++
Status status;
SessionOptions sessionOptions;
RunOptions runOptions;
SavedModelBundle bundle;
std::string modelDir = "/model";
status = LoadSavedModel(sessionOptions, runOptions, modelDir, {"serve"}, &bundle);
Session* session = bundle.session.release();
GraphDef graphDef = bundle.meta_graph_def.graph_def();
Tensor input(tensorflow::DT_FLOAT, {});
Tensor train_flag(tensorflow::DT_BOOL, {});
...
session->Run({{"data_input", input}, {"train_flag_input", train_flag}},
{softmax_output"}, {}, &outputs);
но выходные данные будут пустыми, потому что между #placeholder и нейронной сетью существует #data #pipeline, которая не сохраняется в файле pb, таким образом, когда код C++ импортирует модель, связь между вводом данных и нейронной сетью разрывается. Чтобы решить эту проблему, замените код Python #placeholder и #data pipe этим
#placeholder
handle = tf.placeholder(tf.string, shape=[], name="handle_plc")
data_plc = tf.placeholder(tf.float32, [None] + list(data_shape[1:]))
label_plc = tf.placeholder(tf.float32, [None] + list(label_shape[1:]))
train_flag_plc = tf.placeholder(tf.bool, [None] + list(train_flag_shape[1:]))
#data pipeline
tensor_placeholder = (data_plc, label_plc, train_flag_plc)
dataset_dummy = tf.data.Dataset.from_tensor_slices(tensor_placeholder)
dataset_dummy = dataset_dummy.batch(self.batch_size)
iterator = tf.data.Iterator.from_string_handle(handle, dataset_dummy.output_types,
dataset_dummy.output_shapes)
data_input, label_input, train_flag_input = iterator.get_next()
data_input = tf.identity(data_input, name="data_input")
label_input = tf.identity(label_input, name="label_input")
train_flag_input = tf.identity(train_flag_input, name="train_flag_input")
поэтому вы берете узлы после конвейера данных