Tensorflow C++ API从入门到放弃
1、由
搭建了一个基于Tensorflow的小模型,想把它弄到手机上可随时把玩。
可惜Python与Android似乎水土不服,难以移植应用。
于是想到了tensorfow的C++ API,结合Qt不就有了吗?于是就有了这一番探究。
2、缘
搜索了很多,没有使用Qt qmake或cmake直接编译tensorflow C++的源代码的。
tensorflow官方支持bazel编译成支持各种平台的库文件来使用。比如Android的so库:
TensorFlow编Android so库总结_tensorflow 编译android so-CSDN博客
Tensorflow C++ so库 for Android 编译全记录_tensorflow so库-CSDN博客
于是下载了bazel,但没有直接安装,想着先看看有没有编译好的库直接拿来试一下。于是找到了官方给的链接:
安装 C 版 TensorFlow
下载解压得到了windows平台的库文件:
3、入
使用Qt创建一个新工程,在pro文件中设置tensorflow C++头文件和库文件目录:
INCLUDEPATH += $$PWD/../../libtensorflow-cpu-windows-x86_64-2.6.0/include
LIBS += -L$$PWD/../../libtensorflow-cpu-windows-x86_64-2.6.0/lib \-ltensorflow
在cpp中加入c_api头文件,并打印tf版本:
#include "tensorflow/c/c_api.h"// ...某函数内:setWindowTitle("TF_Test, TF version:"+QString(TF_Version()));qDebug() << "tf version:" << TF_Version();
编译成功,运行成功,成功打印了TF的版本号:
tf version: 2.6.0
4、弃
一切看起来比较顺利,于是创建一个张量来试试,看了看c_api头文件,使用TF_NewTensor来新建张量,又请教了百度,使用了如下代码:
// 定义数据类型和数据TF_DataType dtype = TF_FLOAT; // 数据类型为 floatfloat data[] = {1.0, 2.0, 3.0, 4.0}; // 数据数组,这里是一个 2x2 的矩阵size_t data_size = sizeof(data); // 数据大小int64_t dims[] = {2, 2}; // 张量形状为 [2, 2]int num_dims = 2; // 形状的大小,这里是2维// 创建 TF_Tensor -- 会崩溃TF_Tensor* tensor = TF_NewTensor(dtype, dims, num_dims, data, data_size, nullptr, nullptr);if (tensor == nullptr) {qDebug() << "Failed to create tensor.";} else {qDebug() << "Successed to create tensor.";}// 使用完 tensor 后释放TF_DeleteTensor(tensor);
编译没有问题,但运行不起来!调试到TF_NewTensor,程序就崩溃了,且没有原因可查!
又搜寻了其它一些方法,都不太对。
查看官方的教程,就是一股脑地介绍API函数,没有示例啊!
TensorFlow C++ API Reference | TensorFlow v2.6.0
而且c_api.h的函数都没找到啊,难道要生肯?!
于是先放弃吧,有机缘再入。