0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Dataset を使った TensorFlow のモデルを SavedModel 形式のファイルから復元して推論を行う(C++編)

Posted at

Dataset を使った TensorFlow のモデルを SavedModel 形式のファイルから復元して推論を行う(C++編)

はじめに

前回の記事 では Python で TensorFlow の Dataset を使用して学習を行い、モデルを SavedModel の形式で保存しました。

今回は、そのモデルを C++ のコードから読み込んで推論を実行してみたいと思います。

本記事で説明しているソースコードは こちら に載せてあります。

実行環境

  • Windows
  • Visual Studio 2015
  • tensorflow 1.10.0

モデルの読み込み

初めにモデルを読み込みます。

infer.cpp
  const std::string export_dir = "./model";
  SavedModelBundle bundle;
  SessionOptions session_options;
  RunOptions run_options;

  Status status = tensorflow::LoadSavedModel(session_options, run_options, export_dir, {tensorflow::kSavedModelTagServe}, &bundle);
  if (!status.ok()) {
    std::cout << status.ToString() << std::endl;
    return -1;
  }

入力データの作成

入力用データ(Tensor 型)を作成します。

infer.cpp
  Tensor batch_size(tensorflow::DT_INT64, tensorflow::TensorShape());
  auto dst = batch_size.flat<long long>().data();
  long long bsize = 3L;
  memcpy(dst, &bsize, sizeof(bsize));

  Tensor input(tensorflow::DT_FLOAT, TensorShape({3, 1}));
  auto input_dst = input.flat<float>().data();
  float arr[3] = {2.0, 3.0, 4.0};
  memcpy(input_dst, arr, sizeof(arr));

Iterator の初期化

Iterator の初期化を行います。"dataset_init" はモデル作成時に指定した initializer の名前です。
また、"input", "target", "batch_size" は同様にモデル作成時に指定した placeholder の名前です。

infer.cpp
  status = bundle.session->Run(
      {{"input", input}, {"target", input}, {"batch_size", batch_size}},
      {},
      {"dataset_init"},
      nullptr);
  if (!status.ok()) {
    std::cout << "Failed to run sesssion (dataset_init)" << std::endl;
    std::cout << status.ToString() << std::endl;
    return -1;
  }

推論の実行

最後に推論を実行します。"output:0" はモデル作成時に指定した出力ノードの名前です。

infer.cpp
  std::vector<Tensor> outputs;
  status = bundle.session->Run({}, {"output:0"}, {}, &outputs);
  if (!status.ok()) {
    std::cout << "Failed to run sesssion (output:0)" << std::endl;
    std::cout << status.ToString() << std::endl;
    return -1;
  }

  Tensor a = outputs.at(0);
  const int out_dim = 3;
  for (int i = 0; i < out_dim; i++) {
    std::cout << a.flat<float>()(i) << std::endl;
  }

実行すると以下のように Python 版とほぼ同じ推論結果が得られます。

2 4.16
3 6.12808
4 8.09616
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?