tenorflow — Нет вывода при вызове обученной модели Tenosrflow V2 в Stack Overflow

В настоящее время я пытаюсь использовать обученную модель Tensorflow в C ++. И я следую за самым высоко оцененным ответом в этом посте: Tensorflow Различные способы экспорта и запуска графа в C ++. Это довольно простая игрушечная модель, подобная следующей:

Файл модели Python:

import tensorflow as tf
import numpy as npdef build_graph():
x = tf.placeholder(dtype=tf.float64, shape=(1, 1), name='X')
y = tf.Variable(np.array([100.0]), dtype=tf.float64, name='Y')
#with tf.control_dependencies([tf.Print(x, [x], message="X is: ")]):
z = tf.add(x, y, name='Res')if __name__ == '__main__':
build_graph()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
saver = tf.train.Saver(tf.trainable_variables())
saver.save(sess, './Checkpoint/toy')

Код логического вывода Python:

import tensorflow as tf
import numpy as npif __name__ == '__main__':
with tf.Session() as sess:
saver = tf.train.import_meta_graph('./Checkpoint/toy.meta')
saver.restore(sess, './Checkpoint/toy')
import ipdb; ipdb.set_trace()

graph = tf.get_default_graph()
x = graph.get_tensor_by_name('X:0')
y = graph.get_tensor_by_name('Res:0')

print sess.run(y, feed_dict {x:np.array([0.0]).reshape([1,1])})

И C ++ файл вывода:

#include "tensorflow/core/public/session.h"#include "tensorflow/core/platform/env.h"#include "tensorflow/core/protobuf/meta_graph.pb.h"
using namespace std;
using namespace tensorflow;

int main(int argc, char ** argv) {
// set up your input paths
const string pathToGraph = "/ABSOLUTE/PATH/TO/Checkpoint/toy.meta";
const string checkpointPath = "/ABSOLUTE/PATH/TO/Checkpoint/toy";

auto session = NewSession(SessionOptions());
if (session == nullptr) {
std::cout << "Session open error!";
return -1;
}
std::cout << "Session open!" << std::endl;

Status status;

// Read in the protobuf graph we exported
MetaGraphDef graph_def;
status = ReadBinaryProto(Env::Default(), pathToGraph, &graph_def);
if (!status.ok()) {
std::cout << "Graph reading error!" << status.ToString();
return -1;
}

std::cout << "Graph reading!" << std::endl;

// Add the graph to the session
status = session->Create(graph_def.graph_def());
if (!status.ok()) {
std::cout << "Graph adding error!" << status.ToString();
return -1;
}
std::cout << "Graph adding!" << std::endl;

// Read weights from the saved checkpoint
Tensor checkpointPathTensor(DT_STRING, TensorShape());
checkpointPathTensor.scalar<std::string>()() = checkpointPath;
status = session->Run(
{{ graph_def.saver_def().filename_tensor_name(), checkpointPathTensor },},
{},
{graph_def.saver_def().restore_op_name()},
nullptr);
if (!status.ok()) {
std::cout << "Weight loading error!" << status.ToString();
return -1;
}
std::cout << "Weight loading!" << std::endl;// and run the inference to your liking
tensorflow::Tensor input_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({1,1}));
//auto input_tensor_mapped = input_tensor.tensor<float, 2>();
auto input_tensor_mapped = input_tensor.matrix<float>();
input_tensor_mapped(0,0) = 1.0;

std::vector<std::pair<std::string, tensorflow::Tensor>> feedDict = {{"X", input_tensor}};
std::vector<std::string> outputOps = {"X", "Y", "X:0", "Y:0", "Res", "Res:0"};
std::vector<tensorflow::Tensor> outputTensors;
status = session->Run(feedDict, outputOps, {}, &outputTensors);
//auto tmp = outputTensors[0].tensor<float, 2>();
//auto tmp = outputTensors[0].matrix<float>();
//std::cout << "\nRes is " << tmp(0);
//tensorflow::TTypes<tensorflow::float32>::Flat res = outputTensors[0].flat<tensorflow::float32>();
//auto res = outputTensors[0].scalar<float>();
//std::cout << outputTensors[0].DebugString() << std::endl;
std::cout << "Output size: " << outputTensors.size() << std::endl;
//std::cout << outputTensors[0].tensor<float, 2>() << std::endl;
//std::cout << "\nRes is " << res();
}

Код логического вывода Python работает, в то время как для кода вывода C ++ размер выходного вектора является всегда 0. Так Ошибка сегментации продолжает появляться, когда я пытаюсь извлечь результат из outputTensors.

Кто-нибудь еще сталкивался с такой же проблемой?

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …