Skip to content

啥是张量?

不是麻辣烫!

Tensor是Pytorch中最基本的数据类型,是一个对象

但Tensor并不是Pytorch独有的,深度学习框架基本都有。

Tensor的创建方法

  • 创建tensor
python
import torch

torch.tensor([1,2])
image-20250222192353735
  • Tensor也有dtype属性

    python
    a = np.array((1,2))
    t= torch.tensor(a)
    t.dtype
image-20250222192740778
  • 也可以创建复数类型的Tensor对象

    python
    z = torch.tensor(1 + 5j, dtype=torch.complex64)  # 指定dtype为复数
image-20250222194001797

张量类型的转化

  • 张量类型的隐式转化:和np.array()一样,当张量中各元素属于不同类型时,会按照高精度进行统一数据类型

    python
    t = torch.tensor([1,1.1])  # 统一数据类型为高精度的float类型
    t.dtype
    image-20250222194626604
  • 张量类型的转化方法:还可以使用float(),int()等方法来转化张量类型

    python
    t1 = torch.tensor([1,2])
    print(t1.float())
    print(t1.double()) # 转化为双精度浮点型,float64
    
    t2 = torch.tensor([1.1,2.2])
    print(t2.int())
    print(t2.short()) # 转化为int16
    image-20250222195211815

张量的维度与形变

np.array一样,Tensor也可以创建高维数组,并进行形变

  • 用序列创建一维数组,并查看张量维度和形状

    python
    t = torch.tensor([1,2])
    print(t.ndim)    # 查看张量维度
    print(t.shape)	 # 查看张量形状
    print(t.size())  # 查看张量size
    print(t.numel())   # 查看张量中有几个元素
    image-20250222200421001
  • 用序列创建二维数组,并查看张量维度和形状

    t = torch.tensor([[1,2],[3,4]])
    print(t.ndim)    # 查看张量维度
    print(t.shape)	 # 查看张量形状
    print(t.size())  # 查看张量size
    print(t.numel())   # 查看张量中有几个元素
    image-20250222200616524
  • 零维张量:张量中只有一个元素,但它是一个向量,而不是一个标量

    • 零维张量torch.tensor(1)既有大小,又有方向,在pytorch里计算可以使用GPU加速
    • 而标量1的话只有大小没有方向
    python
    t = torch.tensor(1)   # 零维张量没有[],区别于torch.tensor([1])
    print(t.ndim)    # 查看张量维度
    print(t.shape)	 # 查看张量形状
    print(t.size())  # 查看张量size
    print(t.numel())   # 查看张量中有几个元素
    image-20250222201158766
  • 高维张量:3维及以上

    python
    a1 = np.array([[1,2,3],[3,4,5]])
    a2 = np.array([[5,6,7],[7,8,8]])
    
    t = torch.tensor([a1,a2]) # 用两个2维数组,创建一个三维张量,np.array([a1,a2])的计算效率更高
    
    print(t.ndim)    # 3
    print(t.shape)	 # (2,2,3) 由两个,两行三列的矩阵构成
    print(t.size())  # (2,2,3)
    print(t.numel())   # 12
image-20250222202649815

张量的形变

  • t.flatten():将任意维度张量展开为一维张量

    python
    a1 = np.array([[1,2,3],[3,4,5]])
    a2 = np.array([[5,6,7],[7,8,8]])
    
    t = torch.tensor([a1,a2]) 
    t.flatten()
    image-20250222204125915
  • t.reshape():将张量变为任意形状

    python
    a1 = np.array([[1,2,3],[3,4,5]])
    a2 = np.array([[5,6,7],[7,8,8]])
    
    t = torch.tensor([a1,a2]) 
    t.reshape((3,4))
    image-20250222204241830

特殊张量的创建方法

  • torch.zeros:全零张量

    python
    torch.zeros([2,3]) # 里面给个形状
    image-20250222205106343
  • torch.ones():全1张量

    python
    torch.ones([2,3]) # 里面给个形状
    image-20250222205258278
  • torch.eye():单位矩阵

    python
    torch.eye(5) # 里面给行列的长度
    image-20250222205351806
  • torch.diag:对角矩阵,需要用一个一维张量来创建

    python
    t = torch.tensor([1,2])
    torch.diag(t)
    image-20250222205558265
  • torch.rand():服从(0,1)均匀分布的张量

    python
    torch.rand(2,3) # 里面给个形状
image-20250222205854155
  • torch.randn():服从标准正态分布的张量

    python
    torch.randn((2,3)) # 里面给个形状
    image-20250222210211018
  • torch.normal():服从指定正态分布的张量

    python
    torch.normal(2,3,size=(2,3)) # mean:2 std:3 size:(2,3)
    image-20250222210349801
  • torch.randint():整数随机采样结果

    python
    torch.randint(0,10,(2,3)) # 从0-10中采样,size:(2,3)
    image-20250222210546128
  • **torch.arange()torch.linspace()**生成数列

    python
    torch.arange(0,5,0.5) # 从0-5,每隔0.5取一个数
    torch.linspace(1,5,3) # 从1-5等距取3个数
    image-20250222210852282
  • torch.empty():生成未初始化的指定形状的张量

    • 未初始化:就是从内存里残留的数据中取六个
image-20250222211225667
  • torch.full():根据形状填充指定数据生成张量

    python
    torch.full((2,3),6)
    image-20250222211722441

根据指定对象的形状创建张量

还可以根据指定对象的形状进行数值填充,生成张量,只需在后面加上_like即可

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

t1 = torch.zeros_like(t)
t2 = torch.empty_like(t)
t3 = torch.ones_like(t)
t4 = torch.full_like(t,5) # 根据t的形状,填充数值为5

display(t1,t2,t3,t4)
image-20250222212322487

r如下图所示,转化前的t,dtype为int,但randn()应该生成浮点型,因此报错

image-20250222212652734

张量和其他相关类型之间的转化方式

张量,数组和列表之间的相互转化

python
t = torch.tensor([1,2])

# 转化为数组
t.numpy()
np.array(t)

# 转化为列表
t.tolist()
list(t)   # 注意使用list()的话,返回的是一个存储了tensor对象的列表,如下图

# 把零维张量转化为数值
t = torch.tensor(1)
t.item()
image-20250222213702325

张量的深拷贝

浅拷贝:引用被拷贝对象的内存地址,把内容搞过来,一般赋值操作就是浅拷贝

深拷贝:重新创建一个新的内存地址,存储一个一摸一样的数据

张量的深拷贝需要使用clone()方法

python
t = torch.tensor([1,2])
t1 = t
t2 = t.clone()
print(id(t),id(t1),id(t2)) # 从打印的内存地址可以看出,浅拷贝的t和t1内存一致,深拷贝的t和t2不一致
image-20250222214528303