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

【自制C++深度学习推理框架】Tensor模板类的设计思路

Tensor模板类的设计思路

为什么要把Armadillo线性代数库arma::fcube封装成Tensor模板类?

arma::fcube是Armadillo线性代数库中的一种数据类型,它是一个三维的float类型张量。Armadillo库是一个C++科学计算库,提供了高效的线性代数和矩阵运算。它支持常用矩阵操作、线性系统求解、特征值求解等功能,并且具有简单易用、高效快速、内存占用少等特点。

将arma::fcube封装成Tensor可以使其更方便地在深度学习等领域中使用,提供了更加直观和易用的接口,同时与其他深度学习框架(如TensorFlow、PyTorch等)进行对接时也比较方便

除了Armadillo库,还有一些其他的常用的线性代数C++库,比如:

  • Eigen:是一个高效的C++线性代数库,支持大部分的矩阵和数组运算,而且提供了矩阵、向量的基本运算方法。

这些线性代数库都是面向高性能计算而设计的,提供了高效、快速、稳定的数字计算模块,可以在科学计算、图像处理、物理模拟等领域中发挥重要作用。

Tensor定义了哪些接口?实现了哪些功能?

Tensor是一个模板类,支持float类型的数据。
Tensor类支持创建张量、访问和修改张量元素,以及一些查询张量属性的功能。
其中还实现了对Tensor对象的复制构造函数、移动构造函数、赋值运算符和移动赋值运算符,并在内部使用了Armadillo线性代数库来存储和操作数据。
它具有以下接口和功能:

构造函数

  • explicit Tensor() = default; // 默认构造函数
  • explicit Tensor(uint32_t channels, uint32_t rows, uint32_t cols); // 创建张量并指定通道数、行数和列数
  • explicit Tensor(const std::vector<uint32_t>& shapes); // 根据形状(shape)创建张量
  • Tensor(const Tensor& tensor); // 复制构造函数
  • Tensor(Tensor&& tensor) noexcept; // 移动构造函数

赋值运算符

  • Tensor& operator=(Tensor&& tensor) noexcept; // 移动赋值运算符
  • Tensor& operator=(const Tensor& tensor); // 赋值运算符

访问张量维度属性接口

  • uint32_t rows() const; // 返回张量的行数
  • uint32_t cols() const; // 返回张量的列数
  • uint32_t channels() const; // 返回张量的通道数
  • uint32_t size() const; // 返回张量中元素的数量
  • bool empty() const; // 返回张量是否为空
  • std::vector<uint32_t> shapes() const; // 返回张量尺寸大小
  • const std::vector<uint32_t>& raw_shapes() const; // 返回张量实际尺寸大小

访问张量元素接口

  • float index(uint32_t offset) const; // 返回张量中offset位置的元素
  • float& index(uint32_t offset); // 返回张量中offset位置的元素(可写)
  • arma::fmat& slice(uint32_t channel); // 返回张量第channel通道中的数据
  • const arma::fmat& slice(uint32_t channel) const; // 返回张量第channel通道中的数据
  • float at(uint32_t channel, uint32_t row, uint32_t col) const; // 返回特定位置的元素

访问张量接口

  • arma::fcube& data(); // 返回张量中的数据
  • const arma::fcube& data() const; // 返回张量中的数据
  • void Show(); // 输出张量

修改张量接口

  • void set_data(const arma::fcube& data); // 设置张量中的具体数据
  • void Ones(); // 设置张量全为1
  • void Rand(); // 随机生成张量(服从标准正太分布,即以0为均值、以1为标准差的正态分布)
  • void Padding(const std::vector<uint32_t> &pads, float padding_value); // 边界填充
  • void Fill(float value); // 用标量值填充
  • void Fill(const std::vector &values); // 用vector填充
  • void ReRawshape(const std::vector<uint32_t>& shapes); // 列优先reshape
  • void ReRawView(const std::vector<uint32_t>& shapes); // 行优先reshape
  • void Transform(const std::function<float(float)>& filter); // 对张量中的元素进行过滤
  • void Flatten(); // 展平张量

为什么这里有两种reshape,因为Armadillo的张量是列优先的,而pytorch实现的reshape是行优先的,
所以我们用一个接口保留列优先的reshape,定义另一个接口来实现行优先的reshape,兼容并对接pytorch。

为什么要定义一个CSV文件数据读取类?

由于CSV文件是一种常见且常用的数据格式,因此这个类方便于数据转换数据读取
CSVDataLoader类主要作用是提供一种便捷的方式来从CSV文件读取数据并转换成fmat矩阵类型,
在这个CSV文件数据读取类中定义了静态方法LoadData和GetMatrixSize来从CSV文件中加载数据和获取CSV文件的尺寸大小。

  • 其中,LoadData方法用于从CSV文件中加载数据并返回一个Armadillo库中的fmat矩阵,该方法的参数包括需要读取的CSV文件路径和分隔符。
  • 而GetMatrixSize方法用于获取CSV文件的尺寸大小,该方法用于在LoadData方法中初始化返回的fmat矩阵,同时该方法也传入CSV文件路径和分隔符两个参数。

相关文章:

【自制C++深度学习推理框架】Tensor模板类的设计思路

Tensor模板类的设计思路 为什么要把Armadillo线性代数库arma::fcube封装成Tensor模板类&#xff1f; arma::fcube是Armadillo线性代数库中的一种数据类型&#xff0c;它是一个三维的float类型张量。Armadillo库是一个C科学计算库&#xff0c;提供了高效的线性代数和矩阵运算。…...

linux--systemd、systemctl

linux--systemd、systemctl 1 介绍1.1 发展sysvinitupstart主角 systemd 登场 1.2 简介 2 优点兼容性启动速度systemd 提供按需启动能力采用 linux 的 cgroups 跟踪和管理进程的生命周期启动挂载点和自动挂载的管理实现事务性依赖关系管理日志服务systemd journal 的优点如下&a…...

加密解密软件VMProtect教程(七):主窗口之控制面板“详情”部分

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…...

国产仪器 4945B/4945C 无线电通信综合测试仪

4945系列无线电通信综合测试仪是多功能、便携式无线电综合测试类仪器&#xff0c;基于软件无线电架构&#xff0c;集成了跳频信号发生与分析、矢量信号发生与解调分析、模拟调制信号发生与解调分析、音频信号发生与分析、音频示波器、自动测试等功能&#xff0c;它可完成无线通…...

数据库原理及应用上机实验一

✨作者&#xff1a;命运之光 ✨专栏&#xff1a;数据库原理及应用上机实验报告整理 目录 ✨一、实验目的和要求 ✨二、实验内容与步骤 &#x1f353;&#x1f353;前言&#xff1a; 数据库原理及应用上机实验报告的一个简单整理后期还会不断完善&#x1f353;&#x1f353;…...

【操作系统】线程常用操作

线程号 就像每个进程都有一个进程号一样&#xff0c;每个线程也有一个线程号。进程号在整个系统中是唯一的&#xff0c;但线程号不同&#xff0c;线程号只在它所属的进程环境中有效。 进程号用 pid_t 数据类型表示&#xff0c;是一个非负整数。线程号则用 pthread_t 数据类型…...

C++编译预处理

目录 一、包含头文件 1&#xff09;#include包含头文件又两种方式&#xff1a; ①#include<文件名>: ②#include"文件名"&#xff1a; 2&#xff09;C98标准后的头文件&#xff1a; ①C的标准库 ②C的标准库 3&#xff09;注意 二、宏定义 1&#xf…...

Spring IOC 的理解

IoC容器是什么&#xff1f; IoC文英全称Inversion of Control&#xff0c;即控制反转&#xff0c;我么可以这么理解IoC容器&#xff1a; “把某些业务对象的的控制权交给一个平台或者框架来同一管理&#xff0c;这个同一管理的平台可以称为IoC 容器。” 我们刚开始学习…...

Linux 学习笔记(七):时间片

一、时间片概念 时间片&#xff08;timeslice&#xff09;又称为 “量子”&#xff08;quantum&#xff09;或 “处理器片”&#xff08;processor slice&#xff09;&#xff0c;是分时操作系统分配给每个正在运行的进程微观上的一段 CPU 时间&#xff08;在抢占内核中是&…...

java并发-ReentrantLock

当多个线程需要同时对共享资源进行操作时&#xff0c;就需要用到线程同步技术。Java中提供了synchronized关键字用于线程同步&#xff0c;而ReentrantLock就是另外一种用于线程同步的技术&#xff0c;本文将介绍ReentrantLock及其使用方法。 ### 1. 概述 ReentrantLock是Java…...

21.模型的访问器和修改器

学习要点&#xff1a; 1.访问器 2.修改器 本节课我们来开始学习数据库模型的访问器和修改器的使用。 一&#xff0e;访问器 1. 访问器&#xff1a;就是在获取数据列表时&#xff0c;拦截属性并对属性进行修改的过程&#xff1b; 2. 比如&#xff0c;我们在输出性别时&#xff0…...

72 yaffs文件系统挂载慢 sync不起作用

1 引言 最近在开放过程中遇到了一个问题&#xff1a;Linux在启动挂载根文件系统时很慢很慢&#xff01;而且每次开机都是这样&#xff0c;一下子让人难以理解。 因为&#xff0c;理论上当机器第一次启动&#xff0c;会扫描完整的rootfs的flash区域&#xff0c;从而建立索引&…...

【无标题】春漫乌海湖!

春漫乌海湖! 杨桂林 黄河流经几字弯内蒙古段的第一段便遇见了镶嵌在大漠中的璀璨明珠乌海湖。 谁也不会相信:这里被乌兰布和、库布其、毛乌素三大沙漠重重包围&#xff0c;矿山林立&#xff0c;煤尘喧嚣飞扬的黑色煤都&#xff0c;如今在金色沙海的映衬下&#xff0c;柔润潋滟周…...

Red Hat重置root密码

目录 前言 1、使用rd.break参数重置root密码 2、使用安装盘重置root密码 前言 我们有时会忘记linux系统的root密码&#xff0c;有的不会重置密码只能重置系统了&#xff0c;下面介绍两种重置root密码的方法 1、使用rd.break参数重置root密码 1、启动系统&#xff0c;并在…...

应急响应之日志排查方法,Linux篇

应急响应之日志排查方法,Linux篇 1.Linux系统日志位置2.Linux日志分析方法3.其他日志的分析中间件日志其他服务日志1.Linux系统日志位置 Linux 系统中的日志一般存放在目录“/var/log/”下,具体的日志功能如下 /var/log/wtmp:记录登录进入、退出、数据交换、关机和重启,即…...

Midjourney AI 官方中文版已开启内测申请;OpenAI 正准备向公众发布一款新的开源语言模型。

&#x1f680; Midjourney AI 官方中文版已开启内测申请&#xff0c;搭载在 QQ 频道上&#xff0c;召唤机器人进行作画。 Midjourney AI 官方中文版已开启内测申请&#xff0c;搭载在 QQ 频道上&#xff0c;召唤机器人进行作画。 可调用 MJ 和 Niji 的最新模型和所有参数&…...

DevOps 的道术法器,探寻 DevOps “立体化”实践之旅

​引言 随着业务的发展&#xff0c;软件发布迭代的频率越来越高&#xff0c;传统的瀑布型模式已经不能满足快速交付的需求&#xff0c;DevOps 也因此受到持续关注。越来越多的公司开始接受并尝试使用 DevOps&#xff0c;期望能使得软件开发中的构建、测试与发布工作变得更加快捷…...

redis 7.x 缓存双写一致性的解决方案

一 redis缓存双写一致性 1.1 保证redis一致性的原则 1.给缓存设置过期时间&#xff0c;定期清理缓存并写回&#xff0c;是保证最终一致性的解决方案。使用场景&#xff1a;在数据读多写少的情况下作为缓存来使用。 我们可以对已存入缓存的数据设置过期时间&#xff0c;所有…...

真题详解(语法分析输入记号流)-软件设计(八十)

真题详解&#xff08;求叶子结点数&#xff09;-软件设计&#xff08;七十九)https://blog.csdn.net/ke1ying/article/details/130787349?spm1001.2014.3001.5501 极限编程XP最佳实践&#xff1a; 测试先行、 按日甚至按小时为客户提供可运行的版本。 组件图的 插座 和插头…...

ffmpeg-编译汇总01

ffmpeg-编译汇总 ubuntu18.04下编译ffmpeg 所有安装目录 /usr/local 1.nasm编译器编译 (nasm-2.13.03解包) ./configure --prefix/usr/local make -j4 sudo make install 注意&#xff1a;能检测到可以不用设置下面的环境。 安装完成后&#xff0c;为了系统能自动找到nasm程序&…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...