Нет вывода при вызове обученной модели Tenosrflow V2 в C++

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

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

import tensorflow as tf
import numpy as np


def 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 np


if __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 ответов

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