Импорт модели из 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")

поэтому вы берете узлы после конвейера данных

0 ответов

Другие вопросы по тегам