PyTorch的基本概念
Tensor的基本概念
张量高于标量、向量、矩阵
标量说零维的张量,向量是一维的张量,矩阵是二维的张量
Tensor与机器学习的关系
Tensor的创建
函数 | 功能 |
---|---|
Tensor(*size) | 基础构造函数 |
Tensor(data) | 类似np.array |
ones(*size) | 全1Tensor |
zeros(*size) | 全0Tensor |
eye(*size) | 对角线为1,其他为0 |
arange(s,e,step) | 从s到e,步长为step |
linspace(s,e,steps) | 从s到e,均匀切分成steps份 |
rand/randn(*size) | 均匀/标准分布 |
normal(mean,std)/uniform_(from,to) | 正态分布/均匀分布 |
randperm(m) | 随机排列 |
实例
随机数 正态分布 标准分布
序列
Tensor的属性
- 每一个Tensor有torch.dtype、torch.device、torch.layout三种属性
- torch.device 标识了torch.Tensor对象在创建之后所存储在的设备名称
- torch.layout表示torch.Tensor内存布局的对象
torch.tensor([1,2,3],dtype=torch.float32,device=torch.device('cpu'))
稀疏的张量
- torch.sparse_coo_tensor
- coo类型表示了非零元素的坐标形式
indices = torch.tensor([0,1,1],[2,0,2]])
values = torch.tensor([3,4,5],dtype=torch.float32)
x = torch.sparse_coo_tensor(i,v,[2,4])
dev = torch.device("cpu")
torch.tensor([2,2],device=dev)
torch.tensor([2,2],dtype=torch.float32,device=dev)
稀疏的张量
i=torch.tensor([[0,1,2],[0,1,2]])
v=torch.tensor([1,2,3])
torch.sparse_coo_tensor(i,v,(4,4))
转成稠密的张量
torch.sparse_coo_tensor(i,v,(4,4)).to_dense()
Tensor的算术运算
加法运算
c=a+b
c=torch.add(a,b)
a.add(b)
a.add_(b)#会修改a的值
减法运算
c=a-b
c=torch.sub(a,b)
a.sub(b)
a.sub_(b)#会修改a的值
乘法运算
- 哈达玛积(element wise,对应元素相乘)
c=a*b
c=torch.mul(a,b)
a.mul(b)
a.mul_(b)
除法运算
c=a/b
c=torch.div(a,b)
a.div(b)
a.div_(b)
矩阵运算
- 二维矩阵乘法运算操作包括torch.mm()、torch.matmul()、@
a=torch.ones(2,1)
b=torch.ones(1,2)
print(torch.mm(a,b))
print(torch.matmul(a,b))
print(a@b)
print(a.matmul(b))
print(a.mm(b))
- 对于高维的Tensor(dim>2),定义其矩阵乘法仅在最后的两个维度上,要求前面的维度必须保持一致,就像矩阵的索引一样并且运算操作只有torch.matmul()
a=torch.ones(1,2,3,4)
b=torch.ones(1,2,4,3)
print(a.matmul(b))
print(torch.matmul(a,b))
幂运算
print(torch.pow(a,2))
print(a.pow(2))
print(a**2)
print(a.pow_(2))
e的n次方
print(torch.exp(a))
b=a.exp_()
开方运算
a.sqrt()
a.sqrt_()
对数
torch.log2(a)
torch.log10(a)
torch.log(a)
torch.log_(a)
Tensor的取整/取余运算
- .floor()向下取整数
- .ceil()向上取整数
- .round()四舍五入
- .trunc()裁剪,只取整数部分
- .frac()只取小数部分
- %取余
Tensor的比较运算
torch.eq(input,other, out=None) #按成员进行等式操作,相同返回True
torch.equal(tensor1,tensor2) #如果tensor1和tensor2有相同的size和elements,则为true
torch.ge(input, other, out=None) #input>= other
torch.gt(input, other, out=None) #input>other
torch.le(input, other, out=None) #input=<other
torch.lt(input, other, out=None) #input<other
torch.ne(input, other, out=None) #input != other 不等于
排序
torch.sort(input, dim=None, descending=False, out=None)
#对目标input进行排序
torch.topk(input, k,dim=None, largest=True, sorted=Trueout=None)
#沿着指定维度返回最大k个数值及其索引值
torch.kthvalue(input, k, dim=None, out=None)
#沿着指定维度返回第k个最小值及其索引值
Tensor判定是否为finite/inf/nan
torch.isfinite(tensor)/torch.isinf(tensor)/torch.isnan(tensor)
返回一个标记元素是否为 finite/inf/nan 的mask 张量
Tensor的三角函数
- torch.abs(input, out=None)
- torch.acos(input, out=None)
- torch.asin(input, out=None)
- torch.atan(input, out=None)
- torch.atan2(input, inpu2out=None)
- torch.cos(input, out=None)
- torch.cosh(input, out=None)
- torch.sin(input, out=None)
- torch.sinh(input, out=None)
- torch.tan(input, out=None)
- torch.tanh(input, out=None)