啥是张量?
不是麻辣烫!
Tensor是Pytorch中最基本的数据类型,是一个对象。
但Tensor并不是Pytorch独有的,深度学习框架基本都有。
Tensor的创建方法
- 创建tensor
import torch
torch.tensor([1,2])

Tensor也有dtype属性
pythona = np.array((1,2)) t= torch.tensor(a) t.dtype

也可以创建复数类型的Tensor对象
pythonz = torch.tensor(1 + 5j, dtype=torch.complex64) # 指定dtype为复数

张量类型的转化
张量类型的隐式转化:和np.array()一样,当张量中各元素属于不同类型时,会按照高精度进行统一数据类型
pythont = torch.tensor([1,1.1]) # 统一数据类型为高精度的float类型 t.dtype
张量类型的转化方法:还可以使用
float()
,int()
等方法来转化张量类型pythont1 = 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
张量的维度与形变
和np.array
一样,Tensor也可以创建高维数组,并进行形变
用序列创建一维数组,并查看张量维度和形状
pythont = torch.tensor([1,2]) print(t.ndim) # 查看张量维度 print(t.shape) # 查看张量形状 print(t.size()) # 查看张量size print(t.numel()) # 查看张量中有几个元素
用序列创建二维数组,并查看张量维度和形状
t = torch.tensor([[1,2],[3,4]]) print(t.ndim) # 查看张量维度 print(t.shape) # 查看张量形状 print(t.size()) # 查看张量size print(t.numel()) # 查看张量中有几个元素
零维张量:张量中只有一个元素,但它是一个向量,而不是一个标量
- 零维张量
torch.tensor(1)
既有大小,又有方向,在pytorch里计算可以使用GPU加速 - 而标量1的话只有大小没有方向
pythont = torch.tensor(1) # 零维张量没有[],区别于torch.tensor([1]) print(t.ndim) # 查看张量维度 print(t.shape) # 查看张量形状 print(t.size()) # 查看张量size print(t.numel()) # 查看张量中有几个元素
- 零维张量
高维张量:3维及以上
pythona1 = 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

张量的形变
t.flatten()
:将任意维度张量展开为一维张量pythona1 = np.array([[1,2,3],[3,4,5]]) a2 = np.array([[5,6,7],[7,8,8]]) t = torch.tensor([a1,a2]) t.flatten()
t.reshape()
:将张量变为任意形状pythona1 = 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))
特殊张量的创建方法
torch.zeros
:全零张量pythontorch.zeros([2,3]) # 里面给个形状
torch.ones()
:全1张量pythontorch.ones([2,3]) # 里面给个形状
torch.eye()
:单位矩阵pythontorch.eye(5) # 里面给行列的长度
torch.diag
:对角矩阵,需要用一个一维张量来创建pythont = torch.tensor([1,2]) torch.diag(t)
torch.rand()
:服从(0,1)均匀分布的张量pythontorch.rand(2,3) # 里面给个形状

torch.randn()
:服从标准正态分布的张量pythontorch.randn((2,3)) # 里面给个形状
torch.normal()
:服从指定正态分布的张量pythontorch.normal(2,3,size=(2,3)) # mean:2 std:3 size:(2,3)
torch.randint()
:整数随机采样结果pythontorch.randint(0,10,(2,3)) # 从0-10中采样,size:(2,3)
**
torch.arange()
和torch.linspace()
**生成数列pythontorch.arange(0,5,0.5) # 从0-5,每隔0.5取一个数 torch.linspace(1,5,3) # 从1-5等距取3个数
torch.empty()
:生成未初始化的指定形状的张量- 未初始化:就是从内存里残留的数据中取六个

torch.full()
:根据形状填充指定数据生成张量pythontorch.full((2,3),6)
根据指定对象的形状创建张量
还可以根据指定对象的形状进行数值填充,生成张量,只需在后面加上_like
即可
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)

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

张量和其他相关类型之间的转化方式
张量,数组和列表之间的相互转化
t = torch.tensor([1,2])
# 转化为数组
t.numpy()
np.array(t)
# 转化为列表
t.tolist()
list(t) # 注意使用list()的话,返回的是一个存储了tensor对象的列表,如下图
# 把零维张量转化为数值
t = torch.tensor(1)
t.item()

张量的深拷贝
浅拷贝:引用被拷贝对象的内存地址,把内容搞过来,一般赋值操作就是浅拷贝
深拷贝:重新创建一个新的内存地址,存储一个一摸一样的数据
张量的深拷贝需要使用clone()
方法
t = torch.tensor([1,2])
t1 = t
t2 = t.clone()
print(id(t),id(t1),id(t2)) # 从打印的内存地址可以看出,浅拷贝的t和t1内存一致,深拷贝的t和t2不一致
