Tensorflow Различные способы экспорта и запуска графика в C ++

Для импорта вашей обученной сети на C ++ вам нужно экспортировать свою сеть, чтобы это сделать. После многого поиска и поиска почти никакой информации об этом, выяснилось, что мы должны использовать freeze_graph (), чтобы это сделать.

Благодаря новой версии Tensorflow версии 0.7 они добавили документацию .

freeze_graph() документацию, я обнаружил, что существует несколько подобных методов, можете ли вы сказать, в чем разница между freeze_graph() и: tf.train.export_meta_graph поскольку она имеет схожие параметры, но, похоже, она также может использоваться для импорта моделей в C ++ (я просто думаю, что разница в том, что для использования вывода файла этим методом вы можете использовать только import_graph_def() или это что-то еще?)

Также один вопрос о том, как использовать write_graph() : в документах graph_def задается sess.graph_def но в примерах в freeze_graph() это sess.graph.as_graph_def() . В чем разница между этими двумя?

Этот вопрос связан с этой проблемой.

Спасибо!

  • Tensorflow GMM ERROR: тензорный поток: модель расходится с потерей = NaN.
  • ищет исходный код из gen_nn_ops в тензорном потоке
  • У объекта TensorFlow 'module' нет атрибута 'global_variables_initializer'
  • TensorFlow не был скомпилирован для использования инструкций SSE (и т. Д.), Но они доступны
  • Оценка работы Tensorflow очень медленная в цикле
  • Предсказание следующего слова с использованием примера тензорного потока модели ptb LSTM
  • Поток больших обучающих и тестовых файлов в DNNClassifier от Tensorflow
  • Использование предварительно обученного вложения слов (word2vec или Glove) в TensorFlow
  • 2 Solutions collect form web for “Tensorflow Различные способы экспорта и запуска графика в C ++”

    Для прогнозирования (и любых других операций) вы можете сделать что-то вроде этого:

    Прежде всего в python вы должны назвать свои переменные или операцию для будущего использования

     self.init = tf.initialize_variables(tf.all_variables(), name="nInit") 

    После обучения расчеты так .., когда у вас есть назначенные переменные, проходят через все их и сохраняют как константы на вашем графике. (почти то же самое можно сделать с помощью этого инструмента замораживания, но я обычно делаю это самостоятельно, проверьте «name = nWeights» в py и cpp ниже)

     def save(self, filename): for variable in tf.trainable_variables(): tensor = tf.constant(variable.eval()) tf.assign(variable, tensor, name="nWeights") tf.train.write_graph(self.sess.graph_def, 'graph/', 'my_graph.pb', as_text=False) 

    Теперь перейдите на c ++ и загрузите наш график и загрузите переменные из сохраненных констант:

     void load(std::string my_model) { auto load_graph_status = ReadBinaryProto(tensorflow::Env::Default(), my_model, &graph_def); auto session_status = session->Create(graph_def); std::vector<tensorflow::Tensor> out; std::vector<string> vNames; int node_count = graph_def.node_size(); for (int i = 0; i < node_count; i++) { auto n = graph_def.node(i); if (n.name().find("nWeights") != std::string::npos) { vNames.push_back(n.name()); } } session->Run({}, vNames, {}, &out); 

    Теперь у вас есть все ваши весы нейронной сети или другие загруженные переменные.

    Аналогично, вы можете выполнять другие операции (помните о именах?); создавать входные и выходные тензоры надлежащего размера, заполнять тензор ввода данными и запускать сеанс следующим образом:

     auto operationStatus = session->Run(input, {"put_your_operation_here"}, {}, &out); 

    Вот мое решение, использующее контрольные точки V2, введенные в TF 0.12.

    Нет необходимости преобразовывать все переменные в константы или замораживать график .

    Для ясности контрольная точка V2 выглядит так в моих models каталогов:

     checkpoint # some information on the name of the files in the checkpoint my-model.data-00000-of-00001 # the saved weights my-model.index # probably definition of data layout in the previous file my-model.meta # protobuf of the graph (nodes and topology info) 

    Часть Python (сохранение)

     with tf.Session() as sess: tf.train.Saver(tf.trainable_variables()).save(sess, 'models/my-model') 

    Если вы создаете Saver с помощью tf.trainable_variables() , вы можете сэкономить себе головную боль и пространство для хранения. Но, возможно, некоторые более сложные модели нуждаются во всех сохраненных данных, затем удалите этот аргумент в Saver , просто убедитесь, что вы создаете Saver после создания графика. Также очень важно дать всем переменным / слоям уникальные имена, иначе вы можете запускать разные задачи .

    Часть Python (вывод)

     with tf.Session() as sess: saver = tf.train.import_meta_graph('models/my-model.meta') saver.restore(sess, tf.train.latest_checkpoint('models/')) outputTensors = sess.run(outputOps, feed_dict=feedDict) 

    Часть C ++ (вывод)

    Обратите внимание, что checkpointPath не является одним из путей к любому из существующих файлов, просто их общий префикс. Если вы ошибочно поместите туда путь к файлу .index , TF не скажет вам, что это было неправильно, но он умрет во время вывода из-за неинициализированных переменных.

     #include <tensorflow/core/public/session.h> #include <tensorflow/core/protobuf/meta_graph.pb.h> using namespace std; using namespace tensorflow; ... // set up your input paths const string pathToGraph = "models/my-model.meta" const string checkpointPath = "models/my-model"; ... auto session = NewSession(SessionOptions()); if (session == nullptr) { throw runtime_error("Could not create Tensorflow session."); } Status status; // Read in the protobuf graph we exported MetaGraphDef graph_def; status = ReadBinaryProto(Env::Default(), pathToGraph, &graph_def); if (!status.ok()) { throw runtime_error("Error reading graph definition from " + pathToGraph + ": " + status.ToString()); } // Add the graph to the session status = session->Create(graph_def.graph_def()); if (!status.ok()) { throw runtime_error("Error creating graph: " + status.ToString()); } // 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()) { throw runtime_error("Error loading checkpoint from " + checkpointPath + ": " + status.ToString()); } // and run the inference to your liking auto feedDict = ... auto outputOps = ... std::vector<tensorflow::Tensor> outputTensors; status = session->Run(feedDict, outputOps, {}, &outputTensors); 
    Python - лучший язык программирования в мире.