1.混合编程的目的
为了在C++主程序中调用,python训练好的神经网络模型,来预测数据。
2.环境
1.win10,
2.vs2015
3.python3.7
3.在VS中配置环境和库
说明:我的python使用anaconda虚环境安装。
1.右击项目->属性->VC++目录
1)包含目录:
Python安装路径/include
2)库目录:
Python安装路径/libs
2.右击项目->属性->连接器->输入->附加依赖库
1.debug下:
python安装目录/libs/python37.lib
2.release下:
python安装目录/libs/python37_d.lib
请注意:
1、debug配置的时候可能没有python37_d.lib,那就把python37.lib复制一个,然后重命名为python37_d.lib就可以啦
2、如果一直报错,但是包含头文件等都没有问题,那么你需要看一下你的python是32位还是64位的。然后根据python的环境去配置vs的环境。
若是64位。请在这里修改为X64
4.C++中运行python代码
三个文件如图所示:
tensor_model.h
#include<python.h>
float tensor_model(float size, float gap);
tensor_model.cpp
#include"tensor_model.h"
float tensor_model(float size, float gap)
{
float res = 0;
//这里需修改成你的主机上python安装的目录
Py_SetPythonHome(L"C:\\Users\\caichunbing\\Anaconda3");
//嵌入python代码
Py_Initialize();
PyObject *pModule, *pFunc;
PyObject *pValue, *psize, *pName;
//导入tensor_model.py
pName = PyUnicode_DecodeFSDefault("tensor_model");
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != NULL)
{
//若导入tensor_model.py 导入成功,则加载模块里的func函数
pFunc = PyObject_GetAttrString(pModule, "func");
if (pFunc != NULL)
{
psize = PyTuple_New(2);
PyTuple_SetItem(psize, 0, PyFloat_FromDouble(size));
PyTuple_SetItem(psize, 1, PyFloat_FromDouble(gap));
//传入参数
pValue = PyObject_CallObject(pFunc, psize);
res = PyFloat_AsDouble(pValue);
}
else
{
printf("load func failure");
}
}
main.cpp
#include"tensor_model.h"
int main()
{
float size = 1000;
float gap = 25;
float r;
r= tensor_model(size, gap);
printf("size=%f gap=%f ==> r=%f", size, gap, r);
getchar();
return 0;
}
注意,需导入tensor_model.py 需和生成的.exe文件 放在同一个目录。
下面是tensor_model.py代码
import numpy as np
import tensorflow as tf
def func(Size,Gap):
#读取用tensorflow lite转换为.tflite的神经网络模型
interpreter = tf.lite.Interpreter(model_path="./save_model.tflite")
interpreter.allocate_tensors()
input_details = interpreter.get_input_details()
output_details = interpreter.get_output_details()
input_shape = input_details[0]['shape']
sizemax=200.0
sizemin=60.0
gapmax=96.20340108290398
gapmin=19.23409151033765
rmax=336.965204923026
rmin=45.09967318837701
size=Size
gap=Gap
#归一化操作
x1 = (size - sizemin) / (sizemax - sizemin)
x2 = (gap - gapmin) / (gapmax - gapmin)
input_data=np.array(np.array([[x1,x2]]), dtype=np.float32)
interpreter.set_tensor(input_details[0]['index'], input_data)
interpreter.invoke()
output_data = interpreter.get_tensor(output_details[0]['index'])
#反归一化操作
predout = output_data * (rmax - rmin) + rmin
//得到从神经网络的输出值
pre=float(predout)
return pre
注意,save_model.tflite模型文件需和main.cpp源文件放在一起
5.参考:用tensorflow lite工具,转换模型为.tflite
import tensorflow as tf
#saved_model.pb文件所在目录
saved_model_dir = "./save/saved_model"
input_arrays = ['Placeholder']
output_arrays = ['add_1']
input_shapes={'Placeholder':[None,2]}
converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir,input_arrays,input_shapes,output_arrays)
tflite_model = converter.convert()
open("save_model.tflite", "wb").write(tflite_model)