最初は、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 の「完全な」マニュアルはありますか?