PyTorch的张量详解
2023年4月15日大约 2 分钟约 711 字
tensor的定义
import torch
# 通过具体数据定义张量
a = torch.Tensor([[1, 2], [3, 4]])
# 通过数据结构定义张量
a = torch.Tensor(2, 3) # 默认值不管
a = torch.Tensor(2, 3).uniform_(-1, 1) # 均匀分布
a = torch.ones(2, 3) # 全是1
a = torch.zeros(2, 3) # 全是0
a = torch.eye(2, 3) # 对角线是1
a = torch.rand(2, 3) # 0到1的随机数
# 一维张量
a = torch.normal(mean=0.0, std=torch.rand(5)) # 正态分布的值,参数是均值和标准差
a = torch.normal(mean=torch.rand(5), std=torch.rand(5)) # 正态分布的值,参数是均值和标准差
a = torch.arange(0, 10, 1) # 0到9顺序值,步进设为1
a = torch.linspace(2, 10, 3) # 2到10内的等差数列,总共3个值
a = torch.randperm(10) # 0到9随机整数,总共10个值
# 通过一个已经存在的张量的数据结构,定义新张量
b = torch.zeros_like(a)
tensor的属性
- torch.dtype # 数据类型
- torch.device # 存储的设备名字:是CPU还是哪块GPU
- torch.layout # 表示数据在内存中怎么布局的:稠密的张量还是稀疏的张量,默认是稠密的
import torch
# 定义张量时,指定存储设备和张量类型
a = torch.tensor([2, 3], device=torch.device('cpu'), dtype=torch.float32)
# 定义稀疏的张量
i = torch.tensor([[0, 1, 2], [0, 1, 2]]) # 坐标
v = torch.tensor([1, 2, 3]) # 具体值
a = torch.sparse_coo_tensor(i, v, (4, 4))
# 将稀疏的张量转为稠密的张量
b = a.to_dense()
print(b)
稀疏表达的当前数据中,非0元素的个数,非0元素越多就越稀疏,如果全不是0就最稀疏
tensor的运算
import torch
# 加减乘除(对应位置)
a = torch.rand(2, 3)
b = torch.rand(2, 3)
print(a+b)
print(a-b)
print(a*b)
print(a/b)
print(a%2) # 取余数
print(a**3) # 指数运算
print(a.log()) # 对数运算
print(a.sqrt()) # 开平方
# 矩阵运算
a = torch.ones(1, 2, 3, 4)
b = torch.ones(1, 2, 4, 3)
print(a @ b)
# 取整数
print(a.floor()) # 向下取整
print(a.trunc()) # 向下取整
print(a.ceil()) # 向上取整
print(a.round()) # 四舍五入
# 取小数
print(a.frac())
# 比较运算(逐个元素比较并返回掩码张量)
# 注意这里也可以直接使用比较运算符
a = torch.rand(2, 3)
b = torch.rand(2, 3)
print(a.eq(b)) # ==
print(a.ge(b)) # >=
print(a.gt(b)) # >
print(a.le(b)) # <=
print(a.lt(b)) # <
print(a.ne(b)) # !=
# 还有一种两个张量完全相等
print(a.equal(b))
# 排序
a = torch.tensor([[1,3,2],[5,2,7]])
a.sort(dim=1, descending=False) # 对一维进行排序,并降序
# 合法性效验(返回掩码张量)
a.isfinite() # 是否有界
a.isinf() # 是否无界(无穷)
a.isnan(a) # 是否为None
# 其他数学函数
torch.abs() # 绝对值
torch.sign() # 符号值(负数、正数、零)
torch.sigmoid() # 正态分布函数(将数据分布到0和1之间)
两个张量的运算不一定要结构相同,如果满足广播机制的相关结构,则可以进行广播运算