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