内容简介:现在的深度学习框架一般都是基于 Python 来实现,构建、训练、保存和调用模型都可以很容易地在 Python 下完成。但有时候,我们在实际应用这些模型的时候可能需要在其他编程语言下进行,本文将通过 C/C++ 间接调用 Python 的方式来实现在 C/C++ 程序中调用 TensorFlow 预训练好的模型。获取更多精彩,请关注「seniusen」!
现在的深度学习框架一般都是基于 Python 来实现,构建、训练、保存和调用模型都可以很容易地在 Python 下完成。但有时候,我们在实际应用这些模型的时候可能需要在其他编程语言下进行,本文将通过 C/C++ 间接调用 Python 的方式来实现在 C/C++ 程序中调用 TensorFlow 预训练好的模型。
1. 环境配置
-
为了能在 C/C++ 中调用 Python,我们需要配置一下头文件和库的路径,本文以 Code::Blocks 为例介绍。
-
在 Build -> Project options 添加链接库libpython3.5m.so 和头文件 Python.h 所在的路径,不同 Python 版本可以自己根据情况调整。
2. 初始化并导入 Python 模块及相关函数
void Initialize() { Py_Initialize(); if ( !Py_IsInitialized() ) { printf("Initialize failed!"); } // Path of the python file. 需要更改为 python 文件所在路径 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('/home/senius/python/c_python/test/')"); const char* modulName = "forward"; // Module name of python file. pMod = PyImport_ImportModule(modulName); if(!pMod) { printf("Import Module failed!\n"); } const char* funcName = "load_model"; // Function name in the python file. load_model = PyObject_GetAttrString(pMod, funcName); if(!load_model) { printf("Import load_model Function failed!\n"); } funcName = "predict"; // Function name in the python file. predict = PyObject_GetAttrString(pMod, funcName); if(!predict) { printf("Import predict Function failed!\n"); } PyEval_CallObject(load_model, NULL); // 导入预训练的模型 pParm = PyTuple_New(1); // 新建一个元组,参数只能通过元组传入 Python 程序 } 复制代码
- 通过 PyImport_ImportModule 我们可以导入需要调用的 Python 文件,然后再通过 PyObject_GetAttrString 得到模块里面的函数,最后导入预训练的模型并新建一个元组作为参数的传入。
3. 构建从 C 传入 Python 的参数
void Read_data() { const char* txtdata_path = "/home/senius/python/c_python/test/04t30t00.npy"; //Path of the TXT file. 需要更改为txt文件所在路径 FILE *fp; fp = fopen(txtdata_path, "rb"); if(fp == NULL) { printf("Unable to open the file!"); } fread(data, num*SIZE, sizeof(float), fp); fclose(fp); // copying the data to the list int j = 0; pArgs = PyList_New(num * SIZE); // 新建一个列表,并填入数据 while(j < num * SIZE) { PyList_SET_ITEM(pArgs, j, Py_BuildValue("f", data[j])); j++; } } 复制代码
- 读入测试数据,并将数据填入到一个列表。
4. 将列表传入元组,然后作为参数传入 Python 中,并解析返回值
void Test() { PyTuple_SetItem(pParm, 0, pArgs); pRetVal = PyEval_CallObject(predict, pParm); int list_len = PyList_Size(pRetVal); PyObject *list_item = NULL; PyObject *tuple_item = NULL; for (int i = 0; i < list_len; i++) { list_item = PyList_GetItem(pRetVal, i); tuple_item = PyList_AsTuple(list_item); PyArg_ParseTuple(tuple_item, "f", &iRetVal[i]); } } 复制代码
- 传入元组到 Python 程序,调用 predict 函数得到返回值,然后进行解析。
5. 一些参数和主函数
#include <Python.h> #include <stdio.h> #define SIZE 41*41*41*3 #define NUM 100 PyObject* pMod = NULL; PyObject* load_model = NULL; PyObject* predict = NULL; PyObject* pParm = NULL; PyObject* pArgs = NULL; PyObject* pRetVal = NULL; float iRetVal[NUM*3] = {0}; float data[NUM * SIZE] = {0}; int num = 1; //实际的样本数100 void Initialize(); void Read_data(); void Test(); int main(int argc, char **argv) { Initialize(); // 初始化 Read_data(); // 读入数据 Test(); // 调用预测函数并解析返回值 int j = 0; while(j < num*3) { printf("%f\n", iRetVal[j]); j++; } printf("Done!\n"); Py_Finalize(); return 0; } 复制代码
获取更多精彩,请关注「seniusen」!
以上所述就是小编给大家介绍的《在 C/C++ 中使用 TensorFlow 预训练好的模型—— 间接调用 Python 实现》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 调用 TensorFlow 已训练好的模型做图像识别
- TensorFlow 调用预训练好的模型—— Python 实现
- 机器学习weka,java api调用随机森林及保存模型
- 加入Transformer-XL,这个PyTorch包能调用各种NLP预训练模型
- 在 C/C++ 中使用 TensorFlow 预训练好的模型—— 直接调用 C++ 接口实现
- 直观讲解-RPC调用和HTTP调用的区别
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
CSS3实用指南
吉伦瓦特 / 屈超、周志超 / 人民邮电出版社 / 2012-3 / 49.00元
CSS3为Web的视觉样式语言注入了强大的新功能,让设计人员更加轻松自如地设计优美而引人入胜的内容。借助CSS3,不使用图片就可以创建半透明背 景、渐变、阴影等夺人眼球的视觉效果;还可以使用漂亮、独特、非Web安全的字体显示文本;不用Flash就可以创建动画;不用JavaScript就可 以定制适应用户的设备和屏幕尺寸的设计。 本书通过一系列实用且新颖的范例,向读者展示如何实现以上功能和更多......一起来看看 《CSS3实用指南》 这本书的介绍吧!