1

最初は、tensorflow と python の両方を始めたばかりです。

TFlearn DNN ネットワークを含む Python コードがあります。そのコードを C++ に変換して、後でモバイル アプリケーション開発で使用するライブラリに変換する必要があります。

tensorflow の C++ API について読みました (ドキュメントは非常に曖昧で明確ではありません)。そのため、コードを1行ずつ取り出して変換してみました。

最初のステップは、以前にトレーニングされ、Python で保存された保存済みモデルをロードすることでした (C++ でトレーニングを行う必要がないため、tflearn モデルをロードするだけで十分です)。

ファイルを保存するための Python コードは次のとおりです。

network = input_data(shape=[None, 100, 100, 1], name='input')
network = conv_2d(network, 32, 5, activation='relu')
network = avg_pool_2d(network, 2)
network = conv_2d(network, 64, 5, activation='relu')
network = avg_pool_2d(network, 2)
network = fully_connected(network, 128, activation='relu')
network = fully_connected(network, 64, activation='relu')
network = fully_connected(network, 2, activation='softmax',restore=False)
network = regression(network, optimizer='adam', learning_rate=0.0001,
                    loss='categorical_crossentropy', name='target')

model = tflearn.DNN(network, tensorboard_verbose=0)
model.fit(X, y.toarray(), n_epoch=3, validation_set=0.1, shuffle=True,
        show_metric=True, batch_size=32, snapshot_step=100,
        snapshot_epoch=False, run_id='model_finetuning')

model.save('model/my_model.tflearn')

モデルの python コードをロードするには、次のようにしました。

network = input_data(shape=[None, 100, 100, 1], name='input')
network = conv_2d(network, 32, 5, activation='relu')
network = avg_pool_2d(network, 2)
network = conv_2d(network, 64, 5, activation='relu')
network = avg_pool_2d(network, 2)
network = fully_connected(network, 128, activation='relu')
network = fully_connected(network, 64, activation='relu')
network = fully_connected(network, 2, activation='softmax')
network = regression(network, optimizer='adam', learning_rate=0.001,
                     loss='categorical_crossentropy', name='target')
model = tflearn.DNN(network, tensorboard_verbose=0)
model.load('model/my_model.tflearn')

このコードは python の魅力のように機能しましたが、モデルの保存ファイルは実際には次のようにモデル フォルダー内の 4 つのファイルでした。

model
|------------checkpoint
|------------my_model.tflearn.data-00000-of-00001
|------------my_model.tflearn.index
|------------my_model.tflearn.meta

ここで、C++ の部分に進みます。多くの調査の後、次のコードを思いつきました。

#include "tensorflow/core/public/session.h"
#include "tensorflow/core/platform/env.h"

#include <iostream>

using namespace tensorflow;
using namespace std;

int main()
{
    Session* session;
    Status status = NewSession(SessionOptions(), &session);
    if (!status.ok())
    {
        cerr << status.ToString() << "\n";
        return 1;
    }
    else
    {
        cout << "Session created successfully" << endl;
    }
    tensorflow::Tensor input_tensor(tensorflow::DT_FLOAT, tensorflow::TensorShape({1,100,100,1}));
    GraphDef graph_def;

    status = ReadBinaryProto(Env::Default(), "/home/user/PycharmProjects/untitled/model/my_model.tflearn", &graph_def);
    if (!status.ok())
    {
        cerr << status.ToString() << "\n";
        return 1;
    }
    else
    {
        cout << "Read Model File" << endl;
    }
    return 0;
}

そして今、私の質問のために、コードは bazel ビルドを使用して正しく (障害なく) コンパイルされます (tensorflow C++ API の「短い」説明で説明されているように)。しかし、実行しようとすると、モデル ファイルが見つかりません。

私が c++ で行ったことは正しいですか? これは保存されたモデルをロードする正しい方法ですか (保存中に 4 つのファイルが生成される理由がわかりません)。またはそれを行う別のアプローチはありますか?

tensorflow c++ API の「完全な」マニュアルはありますか?

4

2 に答える 2

1

TFLearn チェックポイントを正しく保存する手順を書きました。

...
model = tflearn.DNN(network)

class MonitorCallback(tflearn.callbacks.Callback):
  # Create an other session to clone the model and avoid effecting the training process
  with tf.Session() as second_sess:
    # Clone the current model
    model2 = model
    # Delete the training ops
    del tf.get_collection_ref(tf.GraphKeys.TRAIN_OPS)[:]
    # Save the checkpoint
    model2.save('checkpoint_'+str(training_state.step)+".ckpt")
    # Write a text protobuf to have a human-readable form of the model
    tf.train.write_graph(second_sess.graph_def, '.', 'checkpoint_'+str(training_state.step)+".pbtxt", as_text = True)
  return

mycb = MonitorCallback()
model.fit({'input': X}, {'target': Y}, n_epoch=500, run_id="mymodel", callbacks=mycb)
...

チェックポイントを取得したら、C++ でロードできます。

https://github.com/kecsap/tensorflow_cpp_packaging#load-a-checkpoint-in-c

...そしてあなたは推論のためにそれを:

https://github.com/kecsap/tensorflow_cpp_packaging#inference-in-c

また、C のサンプル コードと、モデルをフリーズしてから C++ にロードする方法も見つけることができます。

于 2018-08-07T13:33:09.220 に答える