补档-自制深度学习推理框架-第二课-Tensor(张量类)的定义
大家好, 推荐我的项目《自制深度学习推理框架》, 同时在 b 站上开源了一门公开课.
学会怎么上手一个现代风格 C++项目。对于以后的面试和求职都是一个不错的项目哦!
视频链接: https://www. bilibili.com/video/BV1E d4y1v7Gb 请配合视频一起观看
Github 链接: https://github.com/zjhellofss/KuiperInfer 欢迎star和PR
课程logo
Kuiper
是太阳系小行星天体带,有兴趣的同学可以自行百度
柯伊伯带
。之所以取这个名字,我是想表达这个框架是具有一定“边缘”属性,同时希望更多的人像“小行星”一样加入到这个星带中来。
关于维度的知识
在Tensor张量中,共有三维数据进行顺序存放,分别是Channels(维度),Rows(行高), Cols(行宽)。
三维矩阵我们可以看作多个连续的二维矩阵组成,最简单的方法就是使用嵌套的vector数组,但是这种方法非常不利于数据的访问(尤其是内存不连续的问题)修改以及查询,特别是在扩容的时候非常不方便,不能很好地满足使用需求。
因此,综合考虑灵活性和开发的难易度,我们会以
Armadillo
类中的
arma::mat
(矩阵
matrix
)类和
arma::cube
作为数据管理(三维矩阵)类来实现Tensor. 一个
cube
由多个
matrix
组成,
cube
又是我们代码中
Tensor
类中的数据实际管理者。
首先我们讲讲
Tensor
类和
Armadillo
中两个类的关系,什么是数据的实际管理者,可以从下方代码看出
Tensor
类中的数据均由
arma::cube
类进行管理、删改、扩充,我们设计的类以
arma::cube
为基础实现了
Tensor
类,我们主要是提供了更方便的访问方式和对外接口。
class Tensor{
public:
void Function1(); // 对外接口1