相关文章推荐
满身肌肉的水桶  ·  optimizer.zero_grad() ...·  2 天前    · 
精明的饺子  ·  java.io.FileNotFoundEx ...·  5 月前    · 
追风的大熊猫  ·  HakuNeko下载 ...·  11 月前    · 
酷酷的鸵鸟  ·  ActiveX - 知乎·  1 年前    · 
急躁的毛巾  ·  yacc - How to fix ...·  1 年前    · 

补档-自制深度学习推理框架-第二课-Tensor(张量类)的定义

大家好, 推荐我的项目《自制深度学习推理框架》, 同时在 b 站上开源了一门公开课.

学会怎么上手一个现代风格 C++项目。对于以后的面试和求职都是一个不错的项目哦!

视频链接: bilibili.com/video/BV1E 请配合视频一起观看

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