如何实现Visual Studio C++调用TensorFlow代码

版权声明:本文为博主原创文章,如需转载请注明出处。因博主水平有限,如有疏忽遗漏,敬请指出。 https://blog.csdn.net/ShadowN1ght/article/details/77933930

对机器学习感兴趣的VS老司机们,在Windows上搭建好TensorFlow开发环境后,应该会迫不及待地想要编写一个C++程序调用TensorFlow代码。只要能调用成功,你就可以将机器学习融入到你的C++程序,给你的程序装上人工智能的翅膀!想想都很兴奋!

(Win搭建TensorFlow环境的操作步骤可参考我的另一篇博文:http://blog.csdn.net/shadown1ght/article/details/77931791)

现在我们就开始介绍如何在VisualStudio 2013/2015中通过python脚本调用TensorFlow代码。其它VS版本或VC6.0可参照本文操作步骤。

首先创建一个MFC或控制台程序,然后右键工程属性,在VC++目录选项页中分别加入python的包含文件目录和库文件目录:

C:\Program Files\Python35\include

C:\Program Files\Python35\libs

C:\Program Files\Python35\Lib

在cpp文件中添加python头文件:

#include <python.h>

在主函数中创建一个线程:

::CreateThread(NULL, 0, Python_TensorFlow, 0, 0, NULL);

加入Python_TensorFlow()函数代码如下:

DWORD WINAPI Python_TensorFlow(LPVOID lParam)
{
    char msg[256] = "11111 ";

    PyObject * pModule = NULL;
    PyObject * pFunc = NULL;
    PyObject * pArg = NULL;

    // 初始化python环境
    Py_Initialize();
    
    // 导入python脚本
    pModule = PyImport_ImportModule("TensorflowTest");
    if (!pModule) {
        OutputDebugStringA("11111 cannot open module!");
        Py_Finalize();
        return 1;
    }

    // 获得TensorFlow函数指针
    pFunc = PyObject_GetAttrString(pModule, "HelloTensor");
    if (!pFunc) {
        OutputDebugStringA("11111 cannot find function!");
        Py_Finalize();
        return 1;
    }

    // 调用TensorFlow函数
    pArg = Py_BuildValue("(s)", "this is a call from c++");
    if (pModule != NULL) {
        PyEval_CallObject(pFunc, pArg);
    }

    Py_Finalize();

    OutputDebugStringA("11111 exit!");
    return 0;
}

然后点击生成解决方案,生成后,在程序Release输出目录下创建TensorflowTest.py文件,并把python安装目录下的python35.dll文件拷贝到Release目录。请确保生成的exe文件、TensorflowTest.py和python35.dll这三个文件都位于同一目录。

然后,编辑TensorflowTest.py文件,输入以下内容:
#!/usr/bin/python3.5
# -*- coding: utf-8 -*-  

import sys
import tensorflow as tf


def HelloTensor(s):
    # 把print输出重定向到当前目录下的log.txt文件
    stdout_backup = sys.stdout
    log_file = open("log.txt", "w")
    sys.stdout = log_file

    # 打印传入参数
    print(s)

    # 调用TensorFlow api
    hello = tf.constant('Hello, Ten1sorFlow!')
    sess = tf.Session()
    print(sess.run(hello))

    # 恢复print输出通道
    log_file.close()
    sys.stdout = stdout_backup

上述代码逻辑很简单:函数HelloTensor()首先把print打印输出重定向到当前目录下的log.txt文件,然后打印传入的参数s,再调用TensorFlow api打印一个TensorFlow常量,最后恢复print打印输出通道。

完成上述所有准备工作后,启动exe程序,触发Python_TensorFlow线程,如一切正常,约6秒后,会在exe目录下生成一个log.txt文件,打开该文件,可看到以下内容:


从打印内容可以看出来,调用是成功的。

至此,我们成功地在VisualStudio 2013/2015 C++程序中调用了TensorFlow代码。

(注:如果你编译本文所述代码,运行程序时,PyImport_ImportModule("TensorflowTest")可能会出错。如果遇到该错误,请参考我下一篇博文《 Windows C++程序调用包含TensorFlow代码的Python脚本出错问题的解决办法》)



猜你喜欢

转载自blog.csdn.net/ShadowN1ght/article/details/77933930