C++调用Python中的Tensorflow模型

作者: 云计算机网 分类: 云主机 发布时间: 2017-05-30 10:58

利用c++调用Python2.7的程序,加载tensorflow模型(为什么不使用Python3,坑太多了,一直解决不好)。整个环境在Ubuntu16.04下完成,利用了kDevelop4 IDE编写C++程序,以及cmake文件。

保存tensorflow模型

首先利用Python写一段tensorflow保存模型的代码:

import tensorflow as tf
import os

def save_model_ckpt(ckpt_file_path):
x = tf.placeholder(tf.int32,name='x')
y = tf.placeholder(tf.int32,name='y')
b = tf.Variable(1,name='b')
xy = tf.multiply(x,y)
op = tf.add(xy,b,name='op_to_store')
sess = tf.Session()
sess.run(tf.global_variables_initializer())

path = os.path.dirname(os.path.abspath(ckpt_file_path))
if os.path.isdir(path) is False:
os.makedirs(path)

tf.train.Saver().save(sess,ckpt_file_path)

feed_dict = {x:4,y:3}
print(sess.run(op,feed_dict))

save_model_ckpt('./model/model.ckpt')

这会在model目录下回保存四个文件

模型加载代码

#classify.py
import tensorflow as tf

def evaluate(pic):
sess = tf.Session()
saver = tf.train.import_meta_graph('/home/tyl/Code/Kprojects/cpython/Test/model/model.ckpt.meta')
saver.restore(sess, tf.train.latest_checkpoint('../model'))
print(type(sess.run('b:0')))
input_x = sess.graph.get_tensor_by_name('x:0')
input_y = sess.graph.get_tensor_by_name('y:0')
op = sess.graph.get_tensor_by_name('op_to_store:0')
add_on_op = tf.multiply(op,2)
ret = sess.run(add_on_op,{input_x:5,input_y:5})
print ret
sess.close()
return pic

这里要注意的是模型加载的路径一定要正确。。。。
C++程序调用Python程序
这里,利用C++程序调用模型加载的Python程序

//readTF.cpp
#include lt;Python.hgt;
#include lt;pythonrun.hgt;
#include lt;iostreamgt;
#include lt;string.hgt;

int main()
{
const int flag= 1;
Py_Initialize();
if (!Py_IsInitialized())
{
return -1;
}

PyRun_SimpleString("import sys");
//路径一定要对
PyRun_SimpleString("sys.path.append('/home/tyl/Code/Kprojects/cpython/Test')");

PyObject* pMod = NULL;
PyObject* pFunc = NULL;
PyObject* pParm = NULL;
PyObject* pRetVal = NULL;
int iRetVal=999;
PyObject* pName = PyString_FromString("classify");
pMod = PyImport_Import(pName);//获取模块
if (!pMod)
{
std::cout lt;lt; pMod lt;lt;std::endl;
return -1;
}
const char* funcName = "evaluate";
pFunc = PyObject_GetAttrString(pMod,funcName);//获取函数
if (!pFunc)
{
std::cout lt;lt; "pFunc error" lt;lt;std::endl;
return -1;
}

pParm = PyTuple_New(1);//新建元组
PyTuple_SetItem(pParm, 0, Py_BuildValue("i",flag));//向Python模块传参
pRetVal = PyObject_CallObject(pFunc,pParm);//获得返回结果

  •   本教程是初学者的教程,介绍如何安装和构建Python和VensterCE开发工具。我希望对PPC和Python新手有所帮助。



      1、首先下载PythonCE安装程序和源码包

      下载地址:http://sourceforge.net/projects/pythonce/files/

      在这个页面中,找到 “pythonce”-“Python-2.5-20061219”的目录,这里我们下载的是2.5版本,已经包含ctypes了。它列出的好几个文件可供下载,我在这里只使用 PythonCE-25-20061219.PPC2003_ARM.CAB (Python的PPC安装程序)和 PythonCE-2.5-20061219-source.zip (Python2.5的源码包),这二个文件,其它的dev.zip和patch.zip看你的需要下载,这里不多做介绍。

      2、安装Python

      (1)将 PythonCE-25-20061219.PPC2003_ARM.CAB 下载至你的PPC,进行安装,安装在SD卡比较好。

      (2)将 PythonCE-2.5-20061219-source.zip 下载至你的PPC中,并将其中的文件解压到 Python 安装目录下,如果有覆盖提示框弹出,则全部覆盖。(当然,你可以有选择的对需要的文件进行解压,不过lib文件夹是不能省的)

      3、下载VensterCE

      VensterCE是一个不错的PPC下的Python开发IDE,可以进行python源码的编辑、调试、浏览类等等,支持语法高亮显示等功能,相当不错。

      下载地址:http://sourceforge.net/projects/vensterce/files/

      在这个页面上,找到“vensterce”-“vensterce-beta-2”,下载 vensterce-beta-2.zip 压缩包,(虽然目前有beta-3可供下载,不过我在PPC上测试时不能用,所以还是下载beta-2)。

      4、安装VensterCE

      具体的安装方法如下:

      把Vensterce-beta-2.zip下载到PPC

      将压缩包内的 venster 目录复制到 Python安装目录下的 Lib 目录下

      将压缩包内的 shared\Andale_Mono.ttf 复制到 Windows\Fonts 目录下

      将压缩包内的 shared\SciLexer.dll 复制到 Python 的安装目录下

      将压缩包内的 pyceide 目录复制到任意位置,双击pyceide\low-res\pyceide.py 运行,OK

      接下来就可以利用 VensterCE 来编写 python代码和调试了。

  • 相关推荐:

  • Python和VensterCE安装与环境
  • C++在继承中虚函数、纯虚
  • Python基础教程:for循环语
  • 让Python代码更易维护的七
  • Python下定时任务框架AP
  • Python运算符及优先级顺序
  • Python语言与其他语言对比
  • Notepad++实现Python运行
  • 深入理解Python面向对象的
  • 再说Python面向对象的三大
  • 网站内容禁止违规转载,转载授权联系中国云计算网