• 4-1 张量的结构操作


    张量结构操作主要包括:张量创建,索引切片,维度变换,合并分割。

    一、创建张量

    张量创建的许多方法和numpy中创建array的方法很像。以下记录一些比较常用的操作:

    (1)直接采用torch.tensor创建,指定数据类型为torch.float

    image.png

    (2)torch.arrage()函数

    image.png

    (3)torch.range()函数

    image.png

    (4)torch.linspace()

    image.png

    (5)torch.zeros()

    image.png

    (6)torch.ones() 和 torch.zeros_like()

    image.png

    (7)torch.fill_()

    image.png

    (8)正态随机分布

    image.png

    (8)特殊矩阵

    image.png

    二、索引切片

    规则切片:

    例如,采用均匀随机分布创建一个矩阵:
    image.png
    第0行:
    image.png
    倒数第一行:
    image.png
    第1行至第3行:
    image.png
    第1行至最后一行,第0列到最后一列每隔两列取一列:
    image.png
    可以使用索引和切片修改部分元素:
    image.png
    省略号可以表示多个冒号:
    image.png

    不规则切片:

    以上切片方式相对规则,对于不规则的切片提取,可以使用torch.index_select, torch.take, torch.gather, torch.masked_select.
    考虑班级成绩册的例子,有4个班级,每个班级5个学生,每个学生7门科目成绩。可以用一个4×5×7的张量来表示。
    image.png
    torch.floor()返回具有 input 元素下限的新张量,最大整数小于或等于每个元素。例如:
    image.png

    torch.index_select()

    抽取每个班级第0个学生,第2个学生,第4个学生的全部成绩:
    image.png
    抽取每个班级第0个学生,第2个学生,第4个学生的第1门课程,第3门课程,第6门课程成绩
    image.png

    torch.take()

    image.png

    torch.masked_select()

    image.png
    以上这些方法仅能提取张量的部分元素值,但不能更改张量的部分元素值得到新的张量。
    如果要通过修改张量的部分元素值得到新的张量,可以使用torch.where,torch.index_fill 和 torch.masked_fill

    torch.where()

    torch.where可以理解为if的张量版本
    image.png

    torch.index_fill()

    image.png

    torch.masked_fill()

    image.png

    三、维度变换

    torch.view()

    image.png

    torch.reshape()

    torch.reshape 可以改变张量的形状。
    image.png
    image.png
    image.png

    torch.squeeze()

    如果张量在某个维度上只有一个元素,利用torch.squeeze可以消除这个维度。
    image.png

    torch.unsqueeze()

    torch.unsqueeze的作用和torch.squeeze的作用相反。
    image.png

    torch.transpose()

    torch.transpose可以交换张量的维度,torch.transpose常用于图片存储格式的变换上。
    如果是二维的矩阵,通常会调用矩阵的转置方法 matrix.t(),等价于 torch.transpose(matrix,0,1)。
    image.png

    四、合并分割

    可以用torch.cat方法和torch.stack方法将多个张量合并,可以用torch.split方法把一个张量分割成多个张量。
    torch.cat和torch.stack有略微的区别,torch.cat是连接,不会增加维度,而torch.stack是堆叠,会增加维度。

    torch.cat()

    第0维:
    image.png
    第1维:
    image.png

    torch.stack()

    第0维:
    image.png
    第1维:
    image.png

    torch.split()

    torch.split是torch.cat的逆运算,可以指定分割份数平均分割,也可以通过指定每份的记录数量进行分割。
    image.png

    image.png
    参考:https://github.com/lyhue1991/eat_pytorch_in_20_days

  • 相关阅读:
    JavaSE 一些技巧 03——Stream流常用API
    肯尼亚市场开发攻略,收藏一篇就够了
    作为一个Java程序员,JVM的这些知识你懂了吗?
    设计数据密集型应用的主要关注点
    2毛钱不到的2A同步降压DCDC电压6V频率1.5MHz电感2.2uH封装SOT23-5芯片MT3520B
    提供一个springboot使用h2数据库是无法使用脚本并报错的处理方案
    C语言,从联合看字节序
    Error: Cannot find module ‘@dcloudio/uni-cli-i18n‘
    一份简便的PyTorch教程,从不用自己配置环境开始。
    私有化部署 给数据安全加把“锁”!
  • 原文地址:https://blog.csdn.net/hxhabcd123/article/details/132890053