安装并使用tensorflow c++ api

May 30,2018

由于工业应用的需要,所以需要安装Tensorflow的c++库,并整合到已有的工程中去。Alibaba采用的python训练模型,在用java调用模型。本文主要是根据自己的实现过程的记录,仅作参考。

##环境

  1. 安装Tensorflow时,需要根据指南安装依赖
    $ sudo apt-get install autoconf automake libtool curl make g++ unzip  # Protobuf Dependencies
    $ sudo apt-get install python-numpy swig python-dev python-wheel      # TensorFlow Dependencies
    

下载TensorFlow_v1.8.0: https://github.com/tensorflow/tensorflow/archive/v1.8.0.tar.gz

  1. 由于解压出来的一级目录下有一个configure文件,需要首先配置该文件
    ps: 如果只需要配置cpu环境就一直回车

     $ ./configure      # 如果只需要配置cpu环境就一直回车
    

    注意:如果会使用到OpenCV,这里的编译命令需要加入--config=monolithic。因为会导致cv::imread函数无法使用,详细的讨论参见: https://github.com/tensorflow/tensorflow/issues/14267

    $ bazel build tensorflow:libtensorflow_cc.so
    
    # 使用OpenCV的编译命令
    $ bazel build --config=monolithic tensorflow:libtensorflow_cc.so
    
    $ sudo cp bazel-bin/tensorflow/libtensorflow_cc.so /usr/local/lib
    $ sudo cp bazel-bin/tensorflow/libtensorflow_framework.so /usr/local/lib
    
  2. 由于可能存在的依赖问题需要根据当前的系统执行名字如build_all_linux.sh的文件

    $ ./tensorflow/contrib/makefile/build_all_linux.sh 
    

    复制源文件到 /usr/local/include/google ,并移除不需要的文件:

    $ sudo mkdir -p /usr/local/include/google/tensorflow
    $ sudo cp -r tensorflow /usr/local/include/google/tensorflow/
    $ sudo find /usr/local/include/google/tensorflow/tensorflow -type f  ! -name "*.h" -delete
    

    复制bazel-genfiles文件夹中所有生成的文件:

    $ sudo cp bazel-genfiles/tensorflow/core/framework/*.h  /usr/local/include/google/tensorflow/tensorflow/core/framework
    $ sudo cp bazel-genfiles/tensorflow/core/lib/core/*.h  /usr/local/include/google/tensorflow/tensorflow/core/lib/core
    $ sudo cp bazel-genfiles/tensorflow/core/protobuf/*.h  /usr/local/include/google/tensorflow/tensorflow/core/protobuf
    $ sudo cp bazel-genfiles/tensorflow/core/util/*.h  /usr/local/include/google/tensorflow/tensorflow/core/util
    $ sudo cp bazel-genfiles/tensorflow/cc/ops/*.h  /usr/local/include/google/tensorflow/tensorflow/cc/ops
    

    由于 kernels 目录下没有任何文件,所以这个指令并没有生效,目前没有问题。但是在*/kernels/boosted_trees/* 目录下有一个.h文件,后期如果代码中报错了,可以把这个文件复制过去

    $ sudo cp bazel-genfiles/tensorflow/core/kernels/*.h  /usr/local/include/google/tensorflow/tensorflow/core/kernels   
    

    复制 third_party 文件夹:

    $ sudo cp -r third_party /usr/local/include/google/tensorflow/
    $ sudo rm -r /usr/local/include/google/tensorflow/third_party/py
    
    # Note: newer versions of TensorFlow do not have the following directory
    $ sudo rm -r /usr/local/include/google/tensorflow/third_party/avro
    
  3. 使用测试程序,看看是否配置成功

    #include "tensorflow/cc/client/client_session.h"
    #include "tensorflow/cc/ops/standard_ops.h"
    #include "tensorflow/core/framework/tensor.h"
    
    int main()
    {
        using namespace tensorflow;
        using namespace tensorflow::ops;
        Scope root = Scope::NewRootScope();
        // Matrix A = [3 2; -1 0]
        auto A = Const(root, { {3.f, 2.f}, {-1.f, 0.f} });
        // Vector b = [3 5]
        auto b = Const(root, { {3.f, 5.f} });
        // v = Ab^T
        auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true));
        std::vector<Tensor> outputs;
        ClientSession session(root);
        // Run and fetch v
        TF_CHECK_OK(session.Run({v}, &outputs));
        // Expect outputs[0] == [19; -3]
        LOG(INFO) << outputs[0].matrix<float>();
        return 0;
    }
    
  4. 可能会遇到这个问题:

     fatal error: unsupported/Eigen/CXX11/Tensor: No such file or directory
    

    建议根据https://www.cnblogs.com/newneul/p/8256803.html通过源码安装Eigen3.3或以上版本

参考资料

Integrate TensorFlow with CMake projects effortlessly
tensorflow c/c++库使用方法
TensorFlow 的 c ++ 实践及各种坑!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值