PyTorch | (3)Tensor及其基本操作

举报
DrugAI 发表于 2021/07/15 04:10:40 2021/07/15
【摘要】 PyTorch | (1)初识PyTorch PyTorch | (2)PyTorch 入门-张量 PyTorch | (3)Tensor及其基本操作 Tensor attributes: 在tensor attributes中有三个类,分别为torch.dtype, torch.device, 和 torch.layout 其中, torch.dtype 是展示...

PyTorch | (1)初识PyTorch

PyTorch | (2)PyTorch 入门-张量

PyTorch | (3)Tensor及其基本操作


Tensor attributes:

在tensor attributes中有三个类,分别为torch.dtype, torch.device, 和 torch.layout

其中, torch.dtype 是展示 torch.Tensor 数据类型的类,pytorch 有八个不同的数据类型,下表是完整的 dtype 列表.

 


Torch.device 是表现 torch.Tensor被分配的设备类型的类,其中分为’cpu’ 和 ‘cuda’两种,如果设备序号没有显示则表示此 tensor 被分配到当前设备, 比如: 'cuda' 等同于 'cuda': X , X 为torch.cuda.current _device() 返回值

我们可以通过 tensor.device 来获取其属性,同时可以利用字符或字符+序号的方式来分配设备

通过字符串

torch.device('cuda:0')

 

运行结果:

device(type='cuda', index=0)

 

torch.device('cpu')
 

运行结果:
device(type='cpu')
 

torch.device('cuda') # 当前设备
 

运行结果:
device(type='cuda')

通过字符串和设备序号

torch.device('cuda', 0)
 

运行结果:

device(type='cuda', index=0)
 

torch.device('cpu', 0)
 

运行结果:
device(type='cpu', index=0)


此外,cpu 和 cuda 设备的转换使用 'to' 来实现:


  
  1. device_cpu = torch.device("cuda") #声明cuda设备
  2. device_cuda = torch.device('cuda') #设备cpu设备
  3. data = torch.Tensor([1])
  4. data.to(device_cpu) #将数据转为cpu格式
  5. data.to(device_cuda) #将数据转为cuda格式

torch.layout 是表现 torch.Tensor 内存分布的类,目前只支持 torch.strided


创建tensor

  • 直接创建

torch.tensor(data, dtype=None, device=None,requires_grad=False)

data - 可以是list, tuple, numpy array, scalar或其他类型

dtype - 可以返回想要的tensor类型

device - 可以指定返回的设备

requires_grad - 可以指定是否进行记录图的操作,默认为False

需要注意的是,torch.tensor 总是会复制 data, 如果你想避免复制,可以使 torch.Tensor. detach(),如果是从 numpy 中获得数据,那么你可以用 torch.from_numpy(), 注from_numpy() 是共享内存的

torch.tensor([[0.1, 1.2], [2.2, 3.1], [4.9, 5.2]])
 

运行结果:


  
  1. tensor([[ 0.1000, 1.2000],
  2. [ 2.2000, 3.1000],
  3. [ 4.9000, 5.2000]])

 

torch.tensor([0, 1])  # Type inference on data 
 

运行结果:

tensor([ 0,  1])
 

 


  
  1. torch.tensor([[0.11111, 0.222222, 0.3333333]],
  2. dtype=torch.float64,
  3. device=torch.device('cuda:0')) # creates a torch.cuda.DoubleTensor

运行结果:

tensor([[ 0.1111,  0.2222,  0.3333]], dtype=torch.float64, device='cuda:0')
 
torch.tensor(3.14159)  # Create a scalar (zero-dimensional tensor)
 

运行结果:

tensor(3.1416)
 
torch.tensor([])  # Create an empty tensor (of size (0,))
 

运行结果:

tensor([])
 

 

  • 从numpy中获得数据

torch.from_numpy(ndarry)

注:生成返回的tensor会和ndarry共享数据,任何对tensor的操作都会影响到ndarry,
反之亦然


  
  1. >>> a = numpy.array([1, 2, 3])
  2. >>> t = torch.from_numpy(a)
  3. >>> t
  4. tensor([ 1, 2, 3])
  5. >>> t[0] = -1
  6. >>> a
  7. array([-1, 2, 3])

 

  • 创建特定的tensor

根据数值要求:


  
  1. torch.zeros(*sizes, out=None, ..)# 返回大小为sizes的零矩阵
  2. torch.zeros_like(input, ..) # 返回与input相同size的零矩阵
  3. torch.ones(*sizes, out=None, ..) #f返回大小为sizes的单位矩阵
  4. torch.ones_like(input, ..) #返回与input相同size的单位矩阵
  5. torch.full(size, fill_value, …) #返回大小为sizes,单位值为fill_value的矩阵
  6. torch.full_like(input, fill_value, …) 返回与input相同size,单位值为fill_value的矩阵
  7. torch.arange(start=0, end, step=1, …) #返回从start到end, 单位步长为step的1-d tensor.
  8. torch.linspace(start, end, steps=100, …) #返回从start到end, 间隔中的插值数目为steps的1-d tensor
  9. torch.logspace(start, end, steps=100, …) #返回1-d tensor ,从10^start到10^end的steps个对数间隔

根据矩阵要求:


  
  1. torch.eye(n, m=None, out=None,…) #返回2-D 的单位对角矩阵
  2. torch.empty(*sizes, out=None, …) #返回被未初始化的数值填充,大小为sizes的tensor
  3. torch.empty_like(input, …) # 返回与input相同size,并被未初始化的数值填充的tensor

 

  • 随机采用生成:


  
  1. torch.normal(mean, std, out=None)
  2. torch.rand(*size, out=None, dtype=None, …) #返回[0,1]之间均匀分布的随机数值
  3. torch.rand_like(input, dtype=None, …) #返回与input相同size的tensor, 填充均匀分布的随机数值
  4. torch.randint(low=0, high, size,…) #返回均匀分布的[low,high]之间的整数随机值
  5. torch.randint_like(input, low=0, high, dtype=None, …) #
  6. torch.randn(*sizes, out=None, …) #返回大小为size,由均值为0,方差为1的正态分布的随机数值
  7. torch.randn_like(input, dtype=None, …)
  8. torch.randperm(n, out=None, dtype=torch.int64) # 返回0到n-1的数列的随机排列

 


张量的操作

  索引: 支持numpy的常用索引和切片操作

  加法:和numpy类似的广播原则


  
  1. #索引操作
  2. y = torch.rand(5,3)
  3. y[1:, 2] #切片和索引
  4. y[y>0.5] #花式索引
  5. #加法操作(和numpy一样的广播原则)
  6. result = x+y
  7. reslut = torch.add(x, y)
  8. y.add_(x) #直接对y的值进行修改,
  9. (以_结尾的方法会直接在原地修改变量, 如x.copy_(y), x.t_()会修改x.)
  10. result = torch.empty(5,3)
  11. torch.add(x, y, out=result) #这里的result必须先定义
  12. #对于一个元素的张量,可以直接通过x.item()拿到元素值
  13. x = torch.ones(3,4)
  14. y = torch.sum(x)
  15. print(y.item(0)) #得到整数12.0

 

cuda Tensor: pytorch 支持Gpu操作,可以在Gpu上创建tensor,通过to()方法可以在cpu和Gpu上间转换tensor


  
  1. if torch.cuda.is_available():
  2. device = torch.device("cuda")
  3. y = torch.ones_like(x, device=device) #直接在Gpu上创建tensor
  4. x = x.to(device) #从cpu上转移到gpu
  5. z = x+y
  6. print(z.to("cpu", torch.double)) #转回到cpu,并改变数据类型

 

  • 点对点操作

三角函数:


  
  1. torch.abs(input, out=None)
  2. torch.acos(input, out=None)
  3. torch.asin(input, out=None)
  4. torch.atan(input, out=None)
  5. torch.atan2(input, inpu2, out=None)
  6. torch.cos(input, out=None)
  7. torch.cosh(input, out=None)
  8. torch.sin(input, out=None)
  9. torch.sinh(input, out=None)
  10. torch.tan(input, out=None)
  11. torch.tanh(input, out=None)

 

基本运算,加减乘除


  
  1. Torch.add(input, value, out=None)
  2. .add(input, value=1, other, out=None)
  3. .addcdiv(tensor, value=1, tensor1, tensor2, out=None)
  4. .addcmul(tensor, value=1, tensor1, tensor2, out=None)
  5. torch.div(input, value, out=None)
  6. .div(input, other, out=None)
  7. torch.mul(input, value, out=None)
  8. .mul(input, other, out=None)

 

对数运算:


  
  1. torch.log(input, out=None) # y_i=log_e(x_i)
  2. torch.log1p(input, out=None) #y_i=log_e(x_i+1)
  3. torch.log2(input, out=None) #y_i=log_2(x_i)
  4. torch.log10(input,out=None) #y_i=log_10(x_i)

 

幂函数:

torch.pow(input, exponent, out=None)  # y_i=input^(exponent)
 

 

指数运算


  
  1. torch.exp(tensor, out=None) #y_i=e^(x_i)
  2. torch.expm1(tensor, out=None) #y_i=e^(x_i) -1

 

截断函数


  
  1. torch.ceil(input, out=None) #返回向正方向取得最小整数
  2. torch.floor(input, out=None) #返回向负方向取得最大整数
  3. torch.round(input, out=None) #返回相邻最近的整数,四舍五入
  4. torch.trunc(input, out=None) #返回整数部分数值
  5. torch.frac(tensor, out=None) #返回小数部分数值
  6. torch.fmod(input, divisor, out=None) #返回input/divisor的余数
  7. torch.remainder(input, divisor, out=None) #同上

 

其他运算


  
  1. torch.erf(tensor, out=None)
  2. torch.erfinv(tensor, out=None)
  3. torch.sigmoid(input, out=None)
  4. torch.clamp(input, min, max out=None) #返回 input<min,则返回min, input>max,则返回max,其余返回input
  5. torch.neg(input, out=None) #out_i=-1*(input)
  6. torch.reciprocal(input, out=None) # out_i= 1/input_i
  7. torch.sqrt(input, out=None) # out_i=sqrt(input_i)
  8. torch.rsqrt(input, out=None) #out_i=1/(sqrt(input_i))
  9. torch.sign(input, out=None) #out_i=sin(input_i) 大于0为1,小于0为-1
  10. torch.lerp(start, end, weight, out=None)

 

  • 降维操作


  
  1. torch.argmax(input, dim=None, keepdim=False) #返回最大值排序的索引值
  2. torch.argmin(input, dim=None, keepdim=False) #返回最小值排序的索引值
  3. torch.cumprod(input, dim, out=None) #y_i=x_1 * x_2 * x_3 *…* x_i
  4. torch.cumsum(input, dim, out=None) #y_i=x_1 + x_2 + … + x_i
  5. torch.dist(input, out, p=2) #返回input和out的p式距离
  6. torch.mean() #返回平均值
  7. torch.sum() #返回总和
  8. torch.median(input) #返回中间值
  9. torch.mode(input) #返回众数值
  10. torch.unique(input, sorted=False) #返回1-D的唯一的tensor,每个数值返回一次.
  11. >>> output = torch.unique(torch.tensor([1, 3, 2, 3], dtype=torch.long))
  12. >>> output
  13. tensor([ 2, 3, 1])
  14. torch.std( #返回标准差)
  15. torch.var() #返回方差
  16. torch.norm(input, p=2) #返回p-norm的范式
  17. torch.prod(input, dim, keepdim=False) #返回指定维度每一行的乘积

 

  • 对比操作:


  
  1. torch.eq(input, other, out=None) #按成员进行等式操作,相同返回1
  2. torch.equal(tensor1, tensor2) #如果tensor1和tensor2有相同的size和elements,则为true
  3. >>> torch.eq(torch.tensor([[1, 2], [3, 4]]), torch.tensor([[1, 1], [4, 4]]))
  4. tensor([[ 1, 0],
  5. [ 0, 1]], dtype=torch.uint8)
  6. >>> torch.eq(torch.tensor([[1, 2], [3, 4]]), torch.tensor([[1, 1], [4, 4]]))
  7. tensor([[ 1, 0],
  8. [ 0, 1]], dtype=torch.uint8)
  9. torch.ge(input, other, out=None) # input>= other
  10. torch.gt(input, other, out=None) # input>other
  11. torch.le(input, other, out=None) # input=<other
  12. torch.lt(input, other, out=None) # input<other
  13. torch.ne(input, other, out=None) # input != other 不等于
  14. torch.max() # 返回最大值
  15. torch.min() # 返回最小值
  16. torch.isnan(tensor) #判断是否为’nan’
  17. torch.sort(input, dim=None, descending=False, out=None) #对目标input进行排序
  18. torch.topk(input, k, dim=None, largest=True, sorted=True, out=None) #沿着指定维度返回最大k个数值及其索引值
  19. torch.kthvalue(input, k, dim=None, deepdim=False, out=None) #沿着指定维度返回最小k个数值及其索引值

 

  • 频谱操作


  
  1. torch.fft(input, signal_ndim, normalized=False)
  2. torch.ifft(input, signal_ndim, normalized=False)
  3. torch.rfft(input, signal_ndim, normalized=False, onesided=True)
  4. torch.irfft(input, signal_ndim, normalized=False, onesided=True)
  5. torch.stft(signa, frame_length, hop, …)

 

  • 其他操作:


  
  1. torch.cross(input, other, dim=-1, out=None) #叉乘(外积)
  2. torch.dot(tensor1, tensor2) #返回tensor1和tensor2的点乘
  3. torch.mm(mat1, mat2, out=None) #返回矩阵mat1和mat2的乘积
  4. torch.eig(a, eigenvectors=False, out=None) #返回矩阵a的特征值/特征向量
  5. torch.det(A) #返回矩阵A的行列式
  6. torch.trace(input) #返回2-d 矩阵的迹(对对角元素求和)
  7. torch.diag(input, diagonal=0, out=None) #
  8. torch.histc(input, bins=100, min=0, max=0, out=None) #计算input的直方图
  9. torch.tril(input, diagonal=0, out=None) #返回矩阵的下三角矩阵,其他为0
  10. torch.triu(input, diagonal=0, out=None) #返回矩阵的上三角矩阵,其他为0

 


参考资料

1. https://zhuanlan.zhihu.com/p/36233589

2. https://www.cnblogs.com/silence-cho/p/11404817.html

 

文章来源: drugai.blog.csdn.net,作者:DrugAI,版权归原作者所有,如需转载,请联系作者。

原文链接:drugai.blog.csdn.net/article/details/104381077

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。