❤ 学习PyTorch之前,想问,什么是张量Tensor ?

目录

一、张量是什么?张量=容器

1.        0阶张量:标量- 只有大小没有方向的数

2.         一阶张量:一维数组 - 有大小有方向

3.         二阶张量:矩阵 - 多个一维数组的拼接

4.        三阶张量 :矩阵的叠加(一张RGB图片)

5.        四阶张量:多个三阶张量组成的数组(一个视频 / 多张RGB图片)

6.        五阶张量: 四阶张量拼接,组成三阶张量的矩阵(多个视频)

二、向量、分量、基向量

基向量

向量和分量

 三、张量在PyTorch中的表示(+ 数据类型)

基础知识点


一、张量是什么?张量=容器

张量是现代机器学习的基础。它的核心是一个数据容器,多数情况下,它包含数字,有时候它也包含字符串。因此把它想象成一个数字的水桶

  1. 张量是多维数组(在这里,我们只考虑其在数学领域内的定义)
  2. 张量是一种不随坐标系的改变而改变的几何对象
  3. 张量是向量和余向量,不会随着坐标系的改变而改变
  4. 张量是多重线性映射

数组是有序的元素序列,我们将 不同维度的数组 定义为不同阶的张量:

1.        0阶张量:标量- 只有大小没有方向的数

2.         一阶张量:一维数组 - 有大小有方向

在这里插入图片描述

3.         二阶张量:矩阵 - 多个一维数组的拼接

在这里插入图片描述

4.        三阶张量 :矩阵的叠加(一张RGB图片)

在这里插入图片描述 

5.        四阶张量:多个三阶张量组成的数组(一个视频 / 多张RGB图片)

 在这里插入图片描述

 

6.        五阶张量: 四阶张量拼接,组成三阶张量的矩阵(多个视频)

在这里插入图片描述

 视频是由多张图片组成的,因此每个视频可以用一个四阶张量表示,显然,多个视频可以用五阶张量表示。

二、向量、分量、基向量

基向量

 向量和分量

 

 在这里,如果表示一个平面中的一个力,那么就需要两个下标:前面的一组下标用来表示平面的位置(力的作用点的空间位置),后面一组下标用来表示力的大小和方向

 三、张量在PyTorch中的表示(+ 数据类型)

Docs » PyTorch官方教程中文版

基础知识点

  • 基本的数据类型属于张量数据类型,即Tensor数据类型,对于python里面的int,float,int array,float array对应于pytorch里面即在前面加一个Tensor即可——intTensor ,Float tensor,IntTensor of size [d1,d2...], FloatTensor of size[d1,d2,...]
  • pytorch,并不能表示string类型的数据类型,一般情况下,可以将其数据分类的string结果进行编码表示,将其编码为一个向量的数据类型[d1,d2...dn],这个方法将其称为One-hot的编码表示方法。其中,n为数据分类结果的类别数目,即表示向量的总长度。
  • 对于pytorch里面的数据进行数据类型判断和输出时,一般有三种方法:
    (1)print(a.type):输出数据a的详细数据类型;
    (2)print(type(a)):输出数据a的基本数据类型,没有(1)中那么详尽;
    (3)print(isinstance(a,torch.FloatTensor)):用来输出数据a是否为torch.Tensor数据类型,即返回值为True或者False.
  • pytorch的张量Tensor数据类型在CPU上即为正常的张量Tensor数据类型如果在GPU上面,则需要将其数据类型转换:
    data=data.cuda(),此时data的数据类型从torch.FlaotTensor转换为了torch.cuda.FloatTensor,它可以在cuda上面进行算法的加速实现。
  • 标量数据a,进行相关的数据定义时,一般将其定义为torch.tensor(a),则输出时返回为tensor(a),其数据shape输出一般为a.shape=tensor.size([]),对于其长度输出len(a.shape)=0,另外,对于a.size()也是等于tensor.size([])的
import torch

# 定义标量
x = torch.tensor(10)
# 输出返回、类型、shape输出、长度输出
print(x)  # tensor(10)
print(x.type)  # <built-in method type of Tensor object at 0x0000018330636D80>
print(x.shape)  # torch.Size([]) 注意:shape后面无()
print(len(x.shape))  # 0
print(x.size())  # torch.Size([])  注意:size()后面有()
  • 对于pytorch里面的任何一个张量数据torch.tensor([d1,d2,d3,d4])     DIM和size以及shape三种数据属性的含义解析与区分如下:
    DIM是指张量数据的长度(即数据的层数,即几阶张量)=len(a.shape),size和shape都是指张量数据的形状;
    另外,a.numel()是指数据的大小为d1*d2*d3*d4
x = torch.tensor([1, 2, 3, 4])

 

x = torch.tensor([[1, 2, 3, 4]])

x = torch.tensor([[1, 2], [3, 4]])

 

x = torch.tensor([[1], [2], [3], [4]])

 

x = torch.tensor([[[1, 2, 3, 4]]])

 

x = torch.tensor([[[1, 2], [3, 4]]])

 

x = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])

 

x = torch.tensor([[[[1], [2], [3], [4]]]])

 

  •  创建Tensor数据的方法主要有以下几种:
    (1)从numpy中导入:
    a=np.array([1.1,2.1)
    b=torch.from_numpy(a)
    注:从numpy中导入的数据float类型其实是double类型的
    (2)从List中导入:
    a=torch.tensor([[1.1,2.1],[1.5,1.2]]),这里的小写tensor中的list数据就是指data本身数据
    b=torch.FloatTensor/Tensor(d1,d2,d3),这里的大写Tensor中为数据的shape即数据的维度组成
  • 生成未初始化的数据uninitialized:
    (1)torch.empty()
    (2)torch.FloatTensor(d1,d2,d3)
    (3)torch.IntTensor(d1,d2,d3)
  • tensor数据的随机初始化的方式—rand/rand_like(0-1),randint(整数数据类型),randn(正态分布数据):
    (1)torch.rand():产生0-1之间的数据
    (2)torch.rand_like(a):a为一个tensor数据类型,产生一个和a数据shape相同的随机tensor数据类型
    (3)torch.randint(min,max,[d1,d2,d3]):产生一个shape类型为[d1,d2,d3]的tensor数据,数据最小和最大分别为min和max
    (4)torch.randn:产生一个正态分布的数据类型N(0,1),对于自定义的正态分布的数据N(mean,std),一般需要用到torch.normal()函数,一般需要两步步骤进行,其具体的用法如下举例所示:
    a=torch.normal(mean=torch.full([10],0)),std=torch.arange(1,0,-0.1))
    b=a.reshape(2,5)
  • 生成一个全部填充相同的数据:torch.full([d1,d2,de3],a)其中填充数据为a
  • 递增或者递减函数API:arange/range
    torch.arange(min,max,distance):左闭右开区间,不包含最大值
    torch.range(min,max,distance):全闭区间,包含最大值,不推荐使用
  • linspace/logspace:线性空间
    (1)torch.linspace(min,max,steps=data number):返回的是等间距的数据,其中左右数据均包括,数据个数为steps,数据间隔为(max-min)/(steps-1)
    (2)torch.logspace(min,max,steps=data number):返回的是10的各个线性空间次方的数值
  • torch中一些零、一和单位张量数据生成API:
    torch.zeros(3,4) #零张量数据
    torch.ones(3,4) #1张量数据
    torch.eye(4,5) #单位张量数据
  • randperm:主要是产生随机的索引值:
    torch.randperm(10):在[0,10),即0-9产生随机的10个索引
  • 使用 torch.Tensor.item()取出张量中包含的数值
    x = torch.tensor([[1]])
    x.item()
  • requires_grad=True可以使得创建的张量可以 torch.autograd自动求梯度并记录在张量中
    x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)
    out = x.pow(2).sum()
    out.backward()
    x.grad


参考资料:

① 对于张量的形象理解:

https://www.zhihu.com/question/23720923/answer/32739132

② 一、张量基础知识:

https://blog.csdn.net/qq_36793268/article/details/107375314

③【tensorflow】浅谈什么是张量tensor:https://blog.csdn.net/qq_31821675/article/details/79188449

④ : pytorch中tensor张量数据基础入门

猜你喜欢

转载自blog.csdn.net/weixin_44917390/article/details/119775913