多平台统一管理软件接口,如何实现多平台统一管理软件接口
287
2022-08-26
【偷偷卷死小伙伴Pytorch20天】-【day12】-【张量的数学运算】
系统教程20天拿下Pytorch 最近和中哥、会哥进行一个小打卡活动,20天pytorch,这是第12天。欢迎一键三连。 后面可能会考虑加速,开学前刷完。
文章目录
一、标量运算二、向量运算三、矩阵运算四、广播机制总结
一、标量运算二、向量运算三、矩阵运算四,广播机制
张量的操作主要包括张量的结构操作和张量的数学运算。
张量结构操作诸如:张量创建,索引切片,维度变换,合并分割。
张量数学运算主要有:标量运算,向量运算,矩阵运算。另外我们会介绍张量运算的广播机制。
本篇我们介绍张量的数学运算。
一、标量运算
张量的数学运算符可以分为标量运算符、向量运算符、以及矩阵运算符。
加减乘除乘方,以及三角函数,指数,对数等常见函数,逻辑比较运算符等都是标量运算符。
标量运算符的特点是对张量实施逐元素运算。
有些标量运算符对常用的数学运算符进行了重载。并且支持类似numpy的广播特性。
import torch import numpy as np
a = torch.tensor([[1.0,2],[-3,4.0]])b = torch.tensor([[5.0,6],[7.0,8.0]])a+b #运算符重载
a = torch.tensor([1.0,8.0])b = torch.tensor([5.0,6.0])c = torch.tensor([6.0,7.0])d = a+b+cprint(d)
x = torch.tensor([2.6,-2.7])print(torch.round(x)) #保留整数部分,四舍五入print(torch.floor(x)) #保留整数部分,向下归整print(torch.ceil(x)) #保留整数部分,向上归整print(torch.trunc(x)) #保留整数部分,向0归整
x = torch.tensor([2.6,-2.7])print(torch.fmod(x,2)) #作除法取余数 print(torch.remainder(x,2)) #作除法取剩余的部分,结果恒正 等价于print(x%2)print(x%2)
# 幅值裁剪x = torch.tensor([0.9,-0.8,100.0,-20.0,0.7])y = torch.clamp(x,min=-1,max = 1)z = torch.clamp(x,max = 1)print(y)print(z)
二、向量运算
向量运算符只在一个特定轴上运算,将一个向量映射到一个标量或者另外一个向量。
#统计值a = torch.arange(1,10).float()print(torch.sum(a))print(torch.mean(a))print(torch.max(a))print(torch.min(a))print(torch.prod(a)) #累乘print(torch.std(a)) #标准差print(torch.var(a)) #方差print(torch.median(a)) #中位数
#指定维度计算统计值b = a.view(3,3)print(b)print(torch.max(b,dim = 0))print(torch.max(b,dim = 1))
#cum扫描:a = torch.arange(1,10)print(torch.cumsum(a,0)) # 累加print(torch.cumprod(a,0))# 累乘
#torch.sort和torch.topk可以对张量排序a = torch.tensor([[9,7,8],[1,3,2],[5,6,4]]).float()print(torch.topk(a,2,dim = 0),"\n")print(torch.topk(a,2,dim = 1),"\n")print(torch.sort(a,dim = 1),"\n")#利用torch.topk可以在Pytorch中实现KNN算法
三、矩阵运算
矩阵必须是二维的。类似torch.tensor([1,2,3])这样的不是矩阵。 矩阵运算包括:矩阵乘法,矩阵转置,矩阵逆,矩阵求迹,矩阵范数,矩阵行列式,矩阵求特征值,矩阵分解等运算。
#矩阵乘法a = torch.tensor([[1,2],[3,4]])b = torch.tensor([[2,0],[0,2]])print(a@b) #等价于torch.matmul(a,b) 或 torch.mm(a,b)
#矩阵转置a = torch.tensor([[1.0,2],[3,4]])print(a.t())
#矩阵逆,必须为浮点类型a = torch.tensor([[1,2],[3,4]],dtype=torch.float32)print(torch.inverse(a))
#矩阵求tracea = torch.tensor([[1.0,2],[3,4]])print(torch.trace(a))
#矩阵求范数a = torch.tensor([[1.0,2],[3,4]])print(torch.norm(a))
#矩阵行列式a = torch.tensor([[1.0,2],[3,4]])print(torch.det(a))
#矩阵特征值和特征向量a = torch.tensor([[1.0,2],[-5,4]],dtype = torch.float)print(torch.eig(a,eigenvectors=True))#两个特征值分别是 2.5+2.7839j, 2.5-2.7839j
#矩阵QR分解, 将一个方阵分解为一个正交矩阵q和上三角矩阵r#QR分解实际上是对矩阵a实施Schmidt正交化得到qa = torch.tensor([[1.0,2.0],[3.0,4.0]])q,r = torch.qr(a)print(q,"\n")print(r,"\n")print(q@r)
#矩阵svd分解#svd分解可以将任意一个矩阵分解为一个正交矩阵u,一个对角阵s和一个正交矩阵v.t()的乘积#svd常用于矩阵压缩和降维a=torch.tensor([[1.0,2.0],[3.0,4.0],[5.0,6.0]])u,s,v = torch.svd(a)print(u,"\n")print(s,"\n")print(v,"\n")print(u@torch.diag(s)@v.t())#利用svd分解可以在Pytorch中实现主成分分析降维
四、广播机制
Pytorch的广播规则和numpy是一样的:
1、如果张量的维度不同,将维度较小的张量进行扩展,直到两个张量的维度都一样。 2、如果两个张量在某个维度上的长度是相同的,或者其中一个张量在该维度上的长度为1,那么我们就说这两个张量在该维度上是相容的。 3、如果两个张量在所有维度上都是相容的,它们就能使用广播。 4、广播之后,每个维度的长度将取两个张量在该维度长度的较大值。 5、在任何一个维度上,如果一个张量的长度为1,另一个张量长度大于1,那么在该维度上,就好像是对第一个张量进行了复制。torch.broadcast_tensors可以将多个张量根据广播规则转换成相同的维度。
a = torch.tensor([1,2,3])b = torch.tensor([[0,0,0],[1,1,1],[2,2,2]])print(b + a)
a_broad,b_broad = torch.broadcast_tensors(a,b)print(a_broad,"\n")print(b_broad,"\n")print(a_broad + b_broad)
总结
一、标量运算
加减乘除乘方,以及三角函数,指数,对数等常见函数,逻辑比较运算符等都是标量运算符。标量运算符的特点是对张量实施逐元素运算。
print(torch.round(x)) #保留整数部分,四舍五入print(torch.floor(x)) #保留整数部分,向下归整print(torch.ceil(x)) #保留整数部分,向上归整print(torch.trunc(x)) #保留整数部分,向0归整print(torch.fmod(x,2)) #作除法取余数 print(torch.remainder(x,2)) #作除法取剩余的部分,结果恒正 等价于torch.clamp(x,min=-1,max = 1) #小于-1的取-1,大于1的取1torch.clamp(x,max = 1)
二、向量运算
向量运算符只在一个特定轴上运算,将一个向量映射到一个标量或者另外一个向量。
print(torch.sum(a))print(torch.mean(a))print(torch.max(a))print(torch.min(a))print(torch.prod(a)) #累乘print(torch.std(a)) #标准差print(torch.var(a)) #方差print(torch.median(a)) #中位数print(torch.cumsum(a,0)) # 层次累加print(torch.cumprod(a,0))# 层次累乘print(torch.topk(a,2,dim = 0),"\n")print(torch.topk(a,3,dim = 1),"\n")print(torch.sort(a,dim = 1),"\n")#利用torch.topk可以在Pytorch中实现KNN算法
三、矩阵运算
矩阵必须是二维的。类似torch.tensor([1,2,3])这样的不是矩阵。 矩阵运算包括:矩阵乘法,矩阵转置,矩阵逆,矩阵求迹,矩阵范数,矩阵行列式,矩阵求特征值,矩阵分解等运算。
# 逆矩阵,必须为浮点类型print(torch.inverse(a))#矩阵求traceprint(torch.trace(a))#矩阵求范数print(torch.norm(a))#矩阵行列式print(torch.det(a))#矩阵特征值和特征向量print(torch.eig(a,eigenvectors=True))#矩阵QR分解, 将一个方阵分解为一个正交矩阵q和上三角矩阵r#QR分解实际上是对矩阵a实施Schmidt正交化得到qq,r = torch.qr(a)#矩阵svd分解#svd分解可以将任意一个矩阵分解为一个正交矩阵u,一个对角阵s和一个正交矩阵v.t()的乘积#svd常用于矩阵压缩和降维u,s,v = torch.svd(a)#利用svd分解可以在Pytorch中实现主成分分析降维
四,广播机制
Pytorch的广播规则和numpy是一样的:
1、如果张量的维度不同,将维度较小的张量进行扩展,直到两个张量的维度都一样。 2、如果两个张量在某个维度上的长度是相同的,或者其中一个张量在该维度上的长度为1,那么我们就说这两个张量在该维度上是相容的。 3、如果两个张量在所有维度上都是相容的,它们就能使用广播。 4、广播之后,每个维度的长度将取两个张量在该维度长度的较大值。 5、在任何一个维度上,如果一个张量的长度为1,另一个张量长度大于1,那么在该维度上,就好像是对第一个张量进行了复制。 torch.broadcast_tensors可以将多个张量根据广播规则转换成相同的维度。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~