C++ tensorflow和TFC++;美国石油学会

C++ tensorflow和TFC++;美国石油学会,c++,tensorflow,C++,Tensorflow,首先,我对tensorflow和python都是新手 我有一个python代码,其中包含一个TFlearn DNN网络。我需要把代码转换成C++,然后再把它转换成一个用于移动应用程序开发的库。 我读了关于TysFooFi的C++ API(其中文档是真实的模糊的,不清楚的)。所以我把代码一行一行地转换过来 第一步是加载以前被训练并保存在Python中的保存模型(我不需要在C++中进行训练,所以只需加载TFEXCEL模型就足够了) 保存文件的python代码如下所示: network = input

首先,我对tensorflow和python都是新手

我有一个python代码,其中包含一个TFlearn DNN网络。我需要把代码转换成C++,然后再把它转换成一个用于移动应用程序开发的库。 <>我读了关于TysFooFi的C++ API(其中文档是真实的模糊的,不清楚的)。所以我把代码一行一行地转换过来

第一步是加载以前被训练并保存在Python中的保存模型(我不需要在C++中进行训练,所以只需加载TFEXCEL模型就足够了)

保存文件的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')
model
|------------checkpoint
|------------my_model.tflearn.data-00000-of-00001
|------------my_model.tflearn.index
|------------my_model.tflearn.meta
加载模型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个文件,如下所示:

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')
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;
}
#包括“tensorflow/core/public/session.h”
#包括“tensorflow/core/platform/env.h”
#包括
使用名称空间tensorflow;
使用名称空间std;
int main()
{
会议*会议;
Status Status=NewSession(SessionOptions(),&session);
如果(!status.ok())
{

CURR

如果你只想加载已经训练过的模型,C++加载器已经存在。直接在TysFooSo/< /P>上 Patwie还提供了一个加载已保存模型的非常好的示例

tensorflow::Status LoadModel(tensorflow::Session*sess,std::string graph\u fn,std::string checkpoint\u fn=”“){
tensorflow::状态;
//读入我们导出的protobuf图
tensorflow::MetaGraphDef graph_def;
status=ReadBinaryProto(tensorflow::Env::Default()、graph\u fn和graph\u def);
if(status!=tensorflow::status::OK())
返回状态;
//在当前会话中创建图形
status=sess->Create(graph_def.graph_def());
if(status!=tensorflow::status::OK())
返回状态;
//从检查点恢复模型,给出iff检查点
如果(检查点_fn!=“”){
const std::string restore_op_name=graph_def.saver_def().restore_op_name();
const std::string filename_tensor_name=图形_def.saver_def().filename_tensor_name();
tensorflow::Tensor filename_Tensor(tensorflow::DT_STRING,tensorflow::TensorShape());
filename\u tensor.scalar()=检查点\u fn;
tensor_dict feed_dict={{filename_tensor_name,filename_tensor};
状态=sess->运行(进刀指令),
{},
{restore_op_name},
nullptr);
if(status!=tensorflow::status::OK())
返回状态;
}否则{
//虚拟状态运行(常量标准::向量和输入,
//常量标准::向量和输出张量名称,
//const std::向量和目标节点名称,
//标准::矢量*输出)=0;
status=sess->Run({},{},{“init”},nullptr);
if(status!=tensorflow::status::OK())
返回状态;
}

遗憾的是,对于TysFraseC++ API,没有一个“完整的和下降的”手册(AFAIK)< /P> < P>我写了如何正确保存TFEXECK检查点:

...
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++中加载:

…然后你可以用它来推断:

还可以找到C的示例代码以及如何冻结模型,然后加载到C++中。