tensorflow c++接口,python训练模型,c++调用

全栈工程师开发手册 (作者:栾鹏)
架构系列文章

gitlab地址:https://github.com/626626cdllp/infrastructure/tree/master/tensorflow_cpp

tensorflow的c++接口

调用tensorflow c++接口,首先要编译tensorflow,要装bazel,要装protobuf,要装Eigen,整体过程还是比较麻烦,bazel安装过程就不说了,下面慢慢来说明下安装步骤。

bazel下载

下载地址:https://github.com/bazelbuild/bazel/releases
mac下载installer-darwin、linux用installer-linux

我下载的是bazel-0.15.2-installer-linux-x86_64.sh,下载完后

./bazel-0.15.2-installer-linux-x86_64.sh

Eigen(矩阵库下载):

wget http://bitbucket.org/eigen/eigen/get/3.3.4.tar.bz2
下载之后解压放在重新命名为eigen3,我存放的路径是,/home/lp/projects/safety/tensorflow_c/eigen3


或者直接到网址https://bitbucket.org/eigen/eigen/downloads/?tab=tags中选择版本下载

protobuf下载及安装:

下载地址:https://github.com/google/protobuf/releases ,我下载的是3.6.0版本,如果你是下载新版的tensorflow,请确保protobuf版本也是最新的,安装步骤:
cd /protobuf
./configure
make
sudo make install
安装之后查看protobuf版本:
protoc --version

tensorflow下载以及编译:

1、下载TensorFlow ,使用 git clone --recursive https://github.com/tensorflow/tensorflow
git非常慢,建议还是直接到网址https://github.com/tensorflow/tensorflow中打包下载

2、下载安装bazel工具(mac下载installer-darwin、linux用installer-linux)

3、进入tensorflow的根目录

3.1 执行./configure 根据提示配置一下环境变量这个官网上有类似的 应该能看到. 要GPU的话要下载nvidia驱动的 尽量装最新版的驱动吧 还有cudnn version为5以上的 这些在官网都有提及的

3.2 有显卡的执行 sudo bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so
没有显卡的执行 sudo bazel build --config=opt //tensorflow:libtensorflow_cc.so

如果是c版本的tensorflow, 把" libtensorflow_cc " 改成 " libtensorflow "
这句命令其实是bazel的用法 具体要生成哪个可以 " vim $(TF_ROOT_PATH)/tensorflow/BUILD " 查看
编译需要挺久的 大概大半个小时吧我记得,这里编译要有sudo权限,否则编译过程会报错。

sudo bazel build --config=opt //tensorflow:libtensorflow_cc.so

注意:上述过程中会链接外网地址,所以需要开启翻墙器使用.并且编译过程会大量占用cpu和内存,所以建议关闭其他占用应用

4、一般是不报错的 如果报错要么是依赖项没有 到时候一个个装就好了 也有个错误是说 protoc 版本太低 这时候更新一下protoc就好了

编译成功会有下面的提示

....
Target //tensorflow:libtensorflow_cc.so up-to-date:
  bazel-bin/tensorflow/libtensorflow_cc.so
INFO: Elapsed time: 1192.883s, Critical Path: 174.02s
INFO: 654 processes: 654 local.
INFO: Build completed successfully, 656 total actions

5、bazel build成功后会有提示的 然后拷贝一下头文件 (你可能找不到,因为需要root权限才能看到, 但是不要切换目录,执行下面的命令就行)

mkdir /usr/local/include/tf
cp -r bazel-genfiles/ /usr/local/include/tf/
cp -r tensorflow /usr/local/include/tf/
cp -r third_party /usr/local/include/tf/
cp bazel-bin/tensorflow/libtensorflow_cc.so /usr/local/lib/
cp bazel-bin/tensorflow/libtensorflow_framework.so /usr/local/lib

我们复制到的地方我们要记住,以便后面使用

上面的环境就是调用tensorflow的c++接口需要的文件了.

我tensorflow 父目录路径是/home/lp/projects/safety/tensorflow_c/tensorflow_cpp,后面在cmakelist.txt文件中注意路径。

python编译生成tensorflow模型文件

python下安装tensorflow比较简单,

第一种方式使用pip安装

如果只想专用cpu加速,安装

pip install --upgrade tensorflow

如果想使用gpu加速,还需要安装

pip install --upgrade tensorflow-gpu

安装以后还需要cuda显卡驱动,可参考https://www.cnblogs.com/fanfzj/p/8521728.html

python生成tensorflow的pb模型文件

代码demo

import tensorflow as  tf
import  numpy as np
import  os
tf.app.flags.DEFINE_integer('training_iteration', 1000,'number of training iterations.')  # 配置参数-迭代次数
tf.app.flags.DEFINE_integer('model_version', 1, 'version number of the model.') # 配置参数-模型版本
tf.app.flags.DEFINE_string('work_dir', 'model/', 'Working directory.') # 配置参数-模型存储路径
FLAGS = tf.app.flags.FLAGS
# 创建模型存储路径
if(not os.path.exists(FLAGS.work_dir)):
    os.makedirs(FLAGS.work_dir)

sess = tf.InteractiveSession()
 
x = tf.placeholder('float', shape=[None, 5],name="inputs")  # 创建输入层  5维float
y_ = tf.placeholder('float', shape=[None, 1])   # 创建输出层 1维float
w = tf.get_variable('w', shape=[5, 1], initializer=tf.truncated_normal_initializer)  # 创建网络层链接  w 并初始化
b = tf.get_variable('b', shape=[1], initializer=tf.zeros_initializer)  # 创建网络层链接  b  并初始化
sess.run(tf.global_variables_initializer())
y = tf.add(tf.matmul(x, w) , b,name="outputs")  # 前向计算
ms_loss = tf.reduce_mean((y - y_) ** 2)  # 误差平方损失值
train_step = tf.train.GradientDescentOptimizer(0.005).minimize(ms_loss)  # 梯度下降法 更新
train_x = np.random.randn(1000, 5)
# let the model learn the equation of y = x1 * 1 + x2 * 2 + x3 * 3
train_y = np.sum(train_x * np.array([1, 2, 3,4,5]) + np.random.randn(1000, 5) / 100, axis=1).reshape(-1, 1)
for i in range(FLAGS.training_iteration):
    loss, _ = sess.run([ms_loss, train_step], feed_dict={x: train_x, y_: train_y})
    if i%100==0:
        print("loss is:",loss)
        graph = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def,["inputs", "outputs"])  # 存储变量为常数值
        tf.train.write_graph(graph, ".", FLAGS.work_dir + "liner.pb",as_text=False)  # 保存模型文件.pb
print('Done exporting!')
print('Done training!')

调用tensorflow的c++接口调用pb模型文件

先制作makefile文件 以便以后运行

CMakeLists.txt文件内容如下:

cmake_minimum_required(VERSION 3.10)
project(cpptensorflow)
set(CMAKE_CXX_STANDARD 11)
link_directories(/home/lp/projects/safety/tensorflow_c/tensorflow_cpp/tensorflow)
include_directories(
        /home/lp/projects/safety/tensorflow_c/tensorflow-master/tensorflow
        /home/lp/projects/safety/tensorflow_c/tensorflow-master/tensorflow/bazel-genfiles
        /home/lp/projects/safety/tensorflow_c/tensorflow-master/tensorflow/bazel-bin/tensorflow
        /home/lp/projects/safety/tensorflow_c/eigen3
)
add_executable(cpptensorflow main.cpp ann_model_loader.h model_loader_base.h ann_model_loader.cpp)
target_link_libraries(cpptensorflow tensorflow_cc tensorflow_framework)

其中 link_directories为指定优先搜索库的路径,也就是.so文件的路径 默认搜索 /usr/local/lib目录,
该目录下有很多.so目录 include_directories为包含的unclude目录.
add_executable参数为要生成的可执行文件的文件名, 要编译的cpp/h文件
target_link_libraries为在lib目录下(包含系统lib目录/usr/local/lib和手动添加目录link_directories,)要包含的.so文件名.其中去掉文件名前面的lib字符串 当多个库存在依赖时,依赖库要写在后面 如果你添加了目标库,但是没有添加目标库的依赖库,就会报错,这个时候你需要将缺少的库也添加到target_link_libraries里面
注意:库的名称是.so文件的文件名去掉前面的lib字符串

在 linux 平台下使用 CMake 生成 Makefile 并编译的流程如下:

编写 CMake 配置文件 CMakeLists.txt 。

执行命令 cmake PATH 或者 ccmake PATH 生成 Makefile, 其中, PATH 是 CMakeLists.txt 所在的目录。
其中ccmake 和 cmake 的区别在于前者提供了一个交互式的界面。

使用 make 命令进行编译。

mkdir  build
cd  build
cmake ..
make 
生成cpptensorflow执行文件:
./cpptensorflow /Users/zhoumeixu/Documents/python/credit-nlp-ner/model/liner.pb
Final value is: 14.9985
Output Prediction Value:14.9985
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付 29.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值