zoukankan      html  css  js  c++  java
  • Pytorch_第二篇_Pytorch tensors 张量基础用法和常用操作

    Pytorch tensors (张量)


    Introduce

    Pytorch的Tensors可以理解成Numpy中的数组ndarrays(0维张量为标量,一维张量为向量,二维向量为矩阵,三维以上张量统称为多维张量),但是Tensors 支持GPU并行计算,这是其最大的一个优点。

    本文首先介绍tensor的基础用法,主要tensor的创建方式以及tensor的常用操作。

    以下均为初学者笔记。

    tensors 基础用法

    • tensors 常用创建方法
    # 创建一个5行3列的矩阵,数据类型为long
    x = torch.empty(5,3,dtype=torch.long)
    # 类似的还有如下创建方式:
    x = torch.zeros()
    x = torch.ones()
    x = torch.ones_like(z) # 创建一个与z形状相同的全1张量。
    x = torch.rand()
    x = torch.eye(2,2) # 2x2单位矩阵
    x = torch.tensor([5.5, 3.0])  # 向量
    # x = torch.tensor(5.5) 标量
    # x = torch.tensor([[5.5, 3.0]]) 矩阵
    
    
    # 对x重新赋值(第一种是5X3全1矩阵,第二种是随机,size与x相同,新制定type覆盖旧type)
    x = x.new_ones(5,3,dtype=torch.double)
    x = torch.randn_like(x,dtype=torch.float)
    
    # tensor与numpy array的相互转换,需要注意的是他们两个用的都是共同的内存空间,即不管哪一个的值发生改变,另外一个都会相应改变
    # 从numpy array创建tensor
    x = torch.from_numpy(np.ones(5))
    # tensor转化为numpy array,调用.numpy()即可
    y = x.numpy()
    
    
    # 返回x的规模,返回值类型为元组tuple,张量也支持Numpy的shpae属性
    x.size()
    # 改变张量的维度,与Numpy的reshape类似
    x = torch.randn(4, 4) # torch.Size([4, 4])
    y = x.view(16) # torch.Size([16]), equal to y = torch.reshape(x,[16])
    z = x.view(-1, 8)  # torch.Size([2, 8]),其中-1表示从其他维度大小推断当前维度大小
    
    # note: 当张量使用了permute和transpose后,tensor占用的内存可能就变得不连续了,因此不能用view()函数来改变张量维度。必须先执行函数contiguous()使tensor占用内存空间连续,其次再使用view()函数改变维度才可。但是后续Pytorch增加了函数reshape()来改变tensor维度,相当于x.contigous().view()的功能,因此要改变维度直接使用y=torch.reshape(x,[16])即可。
    
    • tensors 常用操作方式
    # tensor的拼接
    # cat(),不增加新的维度,在某维度上拼接tensor(理解向量或矩阵的拼接就行)
    # example 1
    x = torch.randn(2,3)
    y = torch.randn(1,3)
    z = torch.cat((x, y), 0)   # 在0维(行)拼接y (y作为x的新行,增加行),维度为(3,3)
    # example 2
    x = torch.randn(2,3)
    y = torch.randn(2,1)
    z = torch.cat((x, y), 1) # 在1维(列)拼接y (y作为x的新列,增加列),维度为(2,4)
    
    
    
    # tensor的堆叠
    # stack(),增加新的维度,在新的维度上拼接tensor(无法想象,可以理解成新创建一个维度,然后把要堆叠的tensor放上去,新维度的大小就为要堆叠tensor的个数)
    # 以下例子请注意堆叠后新size中3的位置
    # example 1
    x = torch.randn(1,2)
    y = torch.randn(1,2)
    z = torch.randn(1,2)
    p = torch.cat((x, y,z), 0) # 在第0维度上堆叠,维度为 (3x1x2)
    # example 2
    x = torch.randn(1,2)
    y = torch.randn(1,2)
    z = torch.randn(1,2)
    p = torch.cat((x, y,z), 1)  # 在第1维度上堆叠,维度为 (1x3x2)
    # example 3
    x = torch.randn(1,2)
    y = torch.randn(1,2)
    z = torch.randn(1,2)
    p = torch.cat((x, y,z), 2) # 在第2维度上堆叠,维度为 (1x2x3)
    
    
    
    # tensor交换两个维度,size中对应维度大小也交换,二维情况下类比于二维矩阵的转置
    # transpose()
    # exmample
    x = torch.randn(1,2)
    x = x.transpose(0,1) # equal to x.transpose_(0,1)
    print(x.size()) # torch.Size([2, 1])
    # note: 一般情况下,函数后面有加_,如x.transpose_(0,1),才会直接对原始tensor x进行操作,否则是返回一个新的tensor,而原始tensor x保持不变。
    
    
    
    # tensor交换多个维度,size中对应维度大小也交换
    # permute()
    # example
    x = torch.randn(1,2,3)
    x = x.permute(2,0,1) # 理解为第零维度用原始第二维度填充,第一维度用原始第零维度填充,第二维度用原始第一维度填充
    print(x.size()) # torch.Size([3, 1, 2])
    
    
    
    # tensor压缩和解压维度
    # squeeze(dim):如果dim维为大小为1,则去除,否则不做任何变化。如若不指定dim,则去除所有大小为1的维度。
    # unsqueeze(dim):在dim上添加一个维度,维度大小为1。
    # example
    z = torch.randn(1,2)
    z.squeeze_()
    print(z.size()) # torch.Size([2])
    z.unsqueeze_(1)
    print(z.size()) # torch.Size([2, 1])
    
    # note: 另外一些常用的方法,比如.sum()、.max()、x[1:]等基本操作都与numpy中的用法类似。
    
    

    本文参考-1

    本文参考-2

  • 相关阅读:
    【持续更新】leetcode算法-数组篇
    【转】敏捷开发之Scrum扫盲篇
    设计Twitter的api
    给一个表达式字符串加括号,计算它的所有的可能的值
    判断一个整数是否是平方数
    Spring Cloud 入门教程(七): 熔断机制 -- 断路器
    断路器(Curcuit Breaker)模式
    Spring Cloud 入门教程(六): 用声明式REST客户端Feign调用远端HTTP服务
    Spring Cloud 入门教程(五): Ribbon实现客户端的负载均衡
    Spring Cloud 入门教程(四): 分布式环境下自动发现配置服务
  • 原文地址:https://www.cnblogs.com/wangqinze/p/13407612.html
Copyright © 2011-2022 走看看