当前位置: 首页 > news >正文

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的函数都没找到啊,难道要生肯?!

于是先放弃吧,有机缘再入。

http://www.xdnf.cn/news/1060849.html

相关文章:

  • STUN (Session Traversal Utilities for NAT) 服务器是一种网络协议
  • MySQL八股文
  • AIGC - Prompt Optimizer 提示词优化器
  • 编程马拉松的定义、运作与发展
  • 解锁微服务潜能:深入浅出 Nacos
  • S32DS上进行S32K328的时钟配置,LPUART时钟配置步骤详解
  • SSH服务与rsync服务配置实战
  • FPGA基础 -- Verilog 概率分布函数
  • Stable Diffusion 实战-手机壁纸制作 第二篇:优化那些“崩脸”和“马赛克”问题,让图像更加完美!
  • 【LLM学习笔记3】搭建基于chatgpt的问答系统(下)
  • AJAX拦截器失效排查指南:当你的beforeSend有效但error/complete沉默时
  • CppCon 2017 学习:Everything You Ever Wanted to Know about DLLs
  • API 接口:程序世界的通用语言与交互基因
  • Spring Boot 虚拟线程 vs WebFlux:谁更胜一筹?
  • 主流防火墙策略绕过漏洞的修复方案与加固实践
  • 啊啊啊啊啊啊啊啊code
  • C++实现手写strlen函数
  • 什么是池化
  • [11-5]硬件SPI读写W25Q64 江协科技学习笔记(20个知识点)
  • Java求职者面试指南:Spring, Spring Boot, Spring MVC, MyBatis技术点深度解析
  • RK3568笔记八十五:LVGL播放AVI视频
  • MySQL读写分离技术详解:架构设计与实践指南
  • 不同系统修改 Docker Desktop 存储路径(从C盘修改到D盘)
  • 【AI论文】SWE-Factory:您的自动化工厂,提供问题解决培训数据和评估基准
  • PHP 生成当月日期
  • JavaEE->多线程2
  • 介绍一款免费MES、开源MES系统、MES源码
  • uni.getStorage 与 uni.getStorageSync 的区别解析
  • 矩阵变换终极笔记
  • react forwardRef和readux的connect冲突,导致ref.current获取不到值