​原文地址:https://www.bearoom.xyz/2018/08/28/win10-build-tf-cc/

首先,我觉得这是一个比较DT的活,因为,tensorflow支持最好的编程语言应该是python(应该说大部分深度学习框架支持的最好的语言都是Python),tensorflow的底层说是C/C++编写的,但是,感觉它对C/C++真的很不友好,有关Python的资料一查一大把,有关C/C++的一查寥寥无几,能看到的还有很多直接就照搬官网的那点少到可怜的例子...由于我可能会比较多的用C/C++来开发,所以,有点希望用上C/C++的API,所以才有了这篇笔记。

好了,就不废话了,在此先推荐一篇之前参考的文章,写得比较清楚了,但是我觉得可能还有点不太准确,或者说我没遇到的问题,或者说我不是这么解决的。

OK,废话不多说,直接上方法:

1、需要准备的东西

首先是软件:

1)、CMake Gui,我这里用的是CMake 3.11.0,基本上3.0以上的应该都OK;VS2015(社区版免费的,基本就可以了);

2)、CUDA9.0以及配套的cudnn7(深度学习必备精品,用CPU的那就不需要了);

3)、Anaconda,官网或者去清华镜像下载(python大蟒蛇的绝佳工具,学习和使用深度学习技术应该还是有必要弄一个的吧);

4)、swigwin-3.0.12(这个我不太清楚是干啥的,但是有用);

5)、梯子(梯子可以解决我参考的那篇博客提到的某些问题,当然这些问题其实也可以用博客的方法解决的);

6)、源码(我下载的是tensorflow1.8的,因为我电脑上装的就是tensorflow1.8 Python版本的);

7)、Git(这很重要,编译过程中要下载文件的,就是通过Git);

2Cmake源码

以上材料和开发环境我就默认是装好的,Anaconda比较好办,参考我之前的一篇笔记,有很简单粗暴易行的方法,其他方法发也很简单,基本能搜到N多教程。然后解压下载下来的源码,用Cmake GUI打开,并设置源码路径和Cmake出来的工程路径:

然后按左下角的 ​,配置工程,然后回报错的:

这里是由于没有设置SWIG的路径,SWIG再官网下载后解压出来就可以了,然后添加到

中,然后再次点击Configure再配置一遍,然后就修改一些项目

tensorflow项里面,有梯子的话就可以这样做:

如果没有梯子的话就这样:

没有GPU的话就把tensorflow_ENABLE_GPU也去掉吧。

然后再次点击Configure配置一边工程,没有报错的话就点击generate生成工程。

3VS2015编译

用VS2015打开vs14_project/tensorflow.sln工程,整个工程Cmake出来时包含274个项目在里面:

首先修改配置属性,改为x64下的Release(因为Anaconda的时Release的,没有Debug,所以这里最好编译Release的,Debug可能会有错误,而且编译一个就差不多9G+了,不想尝试编译Debug了),之后需要修改前面五个文件的配置属性:

配置好后修改一个文件tensorflow\contrib\boosted_trees\lib\utils\sparse_column_iterable.cc,将第99~101行注释掉,改为:

bool operator<( const IndicesRowIterator& other ) const {

    QCHECK_LT( iter_, other.iter_ );

    return ( row_idx_ < other.row_idx_ );

}

然后就右击解决方案生成解决方案,这个过程会超级久,因为还要下载很多依赖项,甚至回有一点卡,我查了下任务管理器,主要时比较耗内存和CPU,CPU占有几乎快满了。然后我是会出现一个问题,跟tf_core_gpu_kernel编译不过有关的(看了下错误,感觉应该时跟访问权限有关,我的CUDA和VS都是装在C盘的,应该就导致访问权限不足,目测是这个原因),这个时候就关闭VS,然后以管理员身份运行VS2015,然后再打开tensorflow工程,然后点编译解决方案(不要重新编译,点编译就可以,不然又得花很多时间),然后这一项会编译很久,超级久的,以至于我都一度怀疑人生。然后还有一个DT的事情,tf_core_kernel编译的时候是很容易出现“compiler is out of heap space”导致这一项编译失败,然后就会出现别的问题,这个时候就是再点编译项目就可以了,再次编译但是不是重新编译,然后就可以了,因为在编译这一项的时候是很占CPU的,CPU几乎就爆满了,所以容易出现问题。

基本上这么做之后就可以编译通过了,但是我这边会有一个错误,跟Python API有关的,tf_python_api这一项我没有编译过,还是报了“cmd.exe”的错误,可能是跟我已经装了tensorflow的python版有关吧,具体没有查,因为这不是我的目的,况且我电脑上已经有tensorflow的Python版,所以这个我就忽略了,也不是很需要这个。

接下来就是打包头文件和lib文件、dll文件,在解决方案中找到INSTALL工程,右键单独对其进行编译,编译完成之后就回把相关的头文件、lib文件、dll文件和exe文件(如果需要的话可以找我要打包出来的文件,编译这个还挺花时间的)。

编译好之后做一下小的测试,试验一下是不是可以用。

4、测试

首先,新建一个控制台应用程序,然后在工程中添加打包出来的头文件和lib文件的路径,代码如下:

#include "stdafx.h"
COMPILER_MSVC
#define NOMINMAX
#include <vector>
#include <Eigen/Dense> #include "tensorflow/core/public/session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/cc/ops/training_ops.h"
#include "tensorflow/core/framework/graph.pb.h" using namespace tensorflow; GraphDef CreateGraphDef()
{
    Scope root = Scope::NewRootScope();     auto X = ops::Placeholder(root.WithOpName("x"), DT_FLOAT, ops::Placeholder::Shape({ -1, 2 }));
    auto A = ops::Const(root, { { 3.f, 2.f },{ -1.f, 0.f } });
    auto Y = ops::MatMul(root.WithOpName("y"), A, X, ops::MatMul::TransposeB(true));
    GraphDef def;
    TF_CHECK_OK(root.ToGraphDef(&def));     return def;
} int main()
{
    GraphDef graph_def = CreateGraphDef();     // Start up the session
    SessionOptions options;
    std::unique_ptr<Session> session(NewSession(options));
    TF_CHECK_OK(session->Create(graph_def));
    
    // Define some data. 
    // This needs to be converted to an Eigen Tensor to be
    // fed into the placeholder. 
    // Note that this will be broken up into two
    // separate vectors of length 2: [1, 2] and [3, 4],
    // which will separately
    // be multiplied by the matrix.
    std::vector<float> data = { 1, 2, 3, 4 };
    auto mapped_X_ = Eigen::TensorMap<Eigen::Tensor<float, 2, Eigen::RowMajor> >(&data[0], 2, 2);
    auto eigen_X_ = Eigen::Tensor<float, 2, Eigen::RowMajor>(mapped_X_);
    
    Tensor X_(DT_FLOAT, TensorShape({ 2, 2 }));
    X_.tensor<float, 2>() = eigen_X_;
    
    std::vector<Tensor> outputs;
    TF_CHECK_OK(session->Run({ { "x", X_ } }, { "y" }, {}, &outputs));     // Get the result and print it out
    Tensor Y_ = outputs[0];
    std::cout << Y_.tensor<float, 2>() << std::endl;
    
    session->Close();
    getchar();
    
    return 0;
}

程序的输出信息如下:

跟Python版一样,也是会先显示一段系统和硬件信息,然后是输出结果,关于代码中的变量和函数等都是什么意思,或者怎么样些一个C++的tensorflow程序,后面我再研究研究吧,不过我Python版都不太会写,所以就还是要花点时间。

给一个我编译好的CPU版本的,Release的,64位,版本是1.8.

​​

win10编译tensorflow C++接口的更多相关文章

  1. ubuntu14 编译tensorflow C++ 接口

    tensorflow1.11 bazel 0.15.2 protobuf 3.6.0 eigen 3.3.5 wget -t 0 -c https://github.com/eigenteam/eig ...

  2. 编译 TensorFlow 的 C/C++ 接口

    TensorFlow 的 Python 接口由于其方便性和实用性而大受欢迎,但实际应用中我们可能还需要其它编程语言的接口,本文将介绍如何编译 TensorFlow 的 C/C++ 接口. 安装环境: ...

  3. Ubuntu16.04编译tensorflow的C++接口

    原文:https://www.bearoom.xyz/2018/09/27/ubuntu1604buildtf4cpp/ 之前有一篇介绍到在windows下利用VS2015编译tensorflow的C ...

  4. 编译TensorFlow源码

      编译TensorFlow源码 参考: https://www.tensorflow.org/install/install_sources https://github.com/tensorflo ...

  5. win10安装Tensorflow

    win10安装Tensorflow 前提: 保证你的pip>=8.1版本 否则利用python -m pip install -U pip  进行升级,或下载pip源文件 确定你的显卡是否支持c ...

  6. win10 安装 tensorflow 并运行helloworld

    win10 安装 tensorflow 并运行helloworld   折腾了一下,在win10上成功安装tensorflow. 1 下载安装python,注意一定要是64位(比如python-3.5 ...

  7. 在Windows*上编译Tensorflow教程

    背景介绍 最简单的 Tensorflow 的安装方法是在 pip 一键式安装官方预编译好的包 pip install tensorflow 通常这种预编译的包的编译参数选择是为了最大兼容性而不是为了最 ...

  8. 编译TensorFlow CPU指令集优化版

    编译TensorFlow CPU指令集优化版 如题,CPU指令集优化版,说的是针对某种特定的CPU型号进行过优化的版本.通常官方给的版本是没有针对特定CPU进行过优化的,有网友称,优化过的版本相比优化 ...

  9. CentOS 6 编译 TensorFlow for Java 以及 Maven Pom

    我们的系统环境 CentOS 6.5, JDK 1.8 更新yum源 $ yum update 安装 Python 2.7 $ yum install python27 python27-numpy ...

随机推荐

  1. 154. 寻找旋转排序数组中的最小值 II

    转跳点:--\(˙<>˙)/-- 原本打算大年三十十一起写完的,结果这篇拖到了年初一…… 这道题比刚刚那道,麻烦一点,因为有重复,所以我们需要考虑重复的情况,就是刚刚的两种情况变成了三种: ...

  2. 2.9 学习总结 之 【Android】体温统计APP

    一.说在前面 昨天 学习了JQ的相关知识 今天 编写体温统计APP 我的工程源码:https://github.com/xiaotian12-call/Take-body-temperature 二. ...

  3. postman带上token对接口进行测试

    根据验证码进行登陆,登录之后返回token.然后请求其他接口时在header头中带上token访问其他接口进行测试 账户信息输入验证码 登陆成功,看到返回的token 我们这个项目可以刷新一下toke ...

  4. R apply()函数

    创建一个列表变量,它的第一个元素包含所有从0到9的平方数,第二个元素为10到19之内的所有平方数,依此类推,最后一个元素为90到99之内的平方数.没有平方数的元素也应该被包含在内! 学习网友的解题思路 ...

  5. 142-PHP trait的定义和使用

    <?php trait info{ //定义trait static function getinfo(){ return '这是一个'.__CLASS__.'类.<br />'; ...

  6. 干货分享:常见的留学生Essay写作逻辑结构

    任何一种类型的Essay写作都应遵循一种逻辑结构,Long Essay可能在不同部分依据情况使用不同的逻辑结构.本文将为大家分享六种常见留学生Essay写作逻辑结构,为方便阅读本文采用中英文对照方式. ...

  7. 吴裕雄--天生自然C++语言学习笔记:C++ 动态内存

    栈:在函数内部声明的所有变量都将占用栈内存. 堆:这是程序中未使用的内存,在程序运行时可用于动态分配内存. 可以使用特殊的运算符为给定类型的变量在运行时分配堆内的内存,这会返回所分配的空间地址.这种运 ...

  8. tornado反向解析

    tornado反向解析 在路由中添加name属性,并且不能使用元组路由,应当由tornado.web.url定义路由. app = tornado.web.Application([ (r'/', I ...

  9. 从GitLab上拉到本地仓库的项目导入到eclipse中

    拉项目 在本地仓库中右键git clone,填写地址 OK, 然后在拉下来的项目上面右键检出创建dev分支. 要将新分支导入到eclipse中, 如果是没有导入过就选第三个,导入过就选第一个. 然后O ...

  10. idea导入新项目后右键main方法没有Run xxx.main()

    刚安装的idea2019.1,基本上没有什么配置.导入从github clone下来的工程.鼠标右键main方法时没有发现 run 选项,如下图所示: 这里是配置有问题造成的,对比下正常的工程,可以发 ...