转载

目录

一、dim的定义

二、dim 的理解

三、举例

torch.argmax()

sum()

cumsum()


一、dim的定义

TensorFlow对张量的阶、维度、形状有着明确的定义,而在pytorh中对其的定义却模糊不清,仅仅有一个torch.size()的函数来查看张量的大小(我理解的这个大小指的就是TensorFlow对张量的形状描述,也和numpy的.shape类似)。所以,首先要搞清楚如何看一个张量的形状

import torch
z = torch.ones(2,3,4)
print(z)
print(z.size())
print(z.size(0))
print(z.size(1))
print(z.size(2))

以上代码的控制台输出为:

tensor([[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]],[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]]])
torch.Size([2, 3, 4])
2
3
4

可见,我们成功创建了一个(2,3,4)大小的张量,那么我们人工应该怎么辨别一个张量的大小呢?为了直观,我把这个张量的中括号调整一个位置:

[[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]],[[1., 1., 1., 1.],[1., 1., 1., 1.],[1., 1., 1., 1.]]
]

我们可以看到:

  • 第一层(最外层)中括号里面包含了两个中括号(以逗号进行分割),这就是(2,3,4)中的2
  • 第二层中括号里面包含了三个中括号(以逗号进行分割),这就是(2,3,4)中的3
  • 第三层中括号里面包含了四个数(以逗号进行分割),这就是(2,3,4)中的4

结论:pytorch中的tensor维度可以通过第一个数前面的中括号数量来判断,有几个中括号维度就是多少。拿到一个维度很高的向量,将最外层的中括号去掉,数最外层逗号的个数,逗号个数加一就是最高维度的维数,如此循环,直到全部解析完毕。

我们还看到:

z.size(0) = 2,z.size(1) = 3,z.size(2) = 4

第0维度为2,第1维度为3,第2维度为4,即维度的标号是以0开始的

二、dim 的理解

网上很多对dim的理解,比如,dim=0,表示的是行,函数的意思就是不要行这一维度,保留列巴拉巴拉之类的,个人觉得不好理解。比如下图博主的理解

那我的理解就是:

控制变量法大家知道吗??或者消融实验?就是几个方法或者实验的比较,保持只有一个因素是可变的,其他都是一致的,就是控制变量法,论文术语也叫消融实验。

所以,dim的使用也是这样,只有dim指定的维度是可变的,其他都是固定不变的

  • dim = 0,列不变(按列-将当前列所有行数据-计算),指定的是行,那就是行变,理解成:针对每一列中,所有行之间的数据比较或者求和等操作,是每一行的比较,因为行是可变的。
  • dim = 1,行不变(按行-将当前行所有列数据-计算),指定的是列,那就是列变,理解成:针对每一行中,所有列之间的数据比较或者求和等操作,是每一行的比较,因为行是可变的。
  • 图解

三、举例

torch.argmax()

  • 得到最大值的序号索引
  • dim=0保留列维度,不要行了,保留列的size就可以了
  • dim=1保留行维度,不要列了,保留行的size就可以了
a = torch.rand((3,4))
print(a)
b = torch.argmax(a, dim=1) ##行不变,指定列,列之间的比较,对下面每列数值进行比较,将最大值对应序号存下,比如下面第一列中第一个值最大,为0,第二列中第二个是最大值,为1,第三列同
print(b)
>>tensor([[0.8338, 0.6953, 0.7558, 0.5803],[0.2105, 0.7638, 0.0912, 0.3341],[0.5585, 0.8019, 0.6590, 0.2268]])
>>tensor([0, 1, 1])

说明:dim=1,指定列,也就是行不变,列之间的比较,所以原来的a有三行,最后argmax()出来的应该也是三个值,第一行的时候,同一列之间比较,最大值是0.8338,索引是0,同理,第二行,最大值的索引是1……

sum()

  • 求和
a = t.arange(0,6).view(2,3)
a
>>tensor([[0, 1, 2],[3, 4, 5]])
a.sum()
a.sum(dim=0) #列不变,指定行,行是可变的,对每一列中的所有行之间的数值进行求和,比如这个例子中,第一列0+3,第二列1+4,第三列2+5
a.sum(dim=1) #行不变,指定列,列是可变的,对每一行中的所有列之间的数值进行求和,比如这个例子中,第一行0+1+2,第二行3+4+5
>>tensor(15.)
>>tensor([3., 5., 7.])
>>tensor([ 3., 12.])

说明:dim=0,指定行,行是可变的,列是不变,所以就是同一列中,每一个行的比较,所以a.sum(dim = 0),第一列的和就是3,第二列的和就是5,第三列的和就是7.
同理,a.sum(dim=1),指定列,列是可变的,行是不变的,所以就是同一列之间的比较或者操作,所以第一行的求和是3,第二行的求和是12

cumsum()

  • 累加
a = t.arange(0,6).view(2,3)
a
>>tensor([[0, 1, 2],[3, 4, 5]])
a.cumsum(dim=0)  # 指定行,列不变,行变,从第一行到最后一行的累加
>>tensor([[0, 1, 2],[3, 5, 7]])a.cumsum(dim=1) # 指定列,行不变,列变,从第一列到最后一列的累加
>>tensor([[ 0,  1,  3],[ 3,  7, 12]])

Python-维度dim的定义及其理解使用相关推荐

  1. Pytorch笔记:维度dim的定义及其理解使用

    import numpy as np# 随机生成维度2*3*4的矩阵 a = np.random.randint(1, 100, [2, 3, 4]) a= array([[[11, 6, 15, 4 ...

  2. Pytorch中维度dim的理解使用

    0 引言 pytorch中的维度dim主要被用在torch.softmax和torch.max等等函数中.理清dim的意思对于正确使用这些函数有重要意义. 1 相关博文: Pytorch笔记:维度di ...

  3. Python 中类的定义和理解

    Python 中类的定义和理解 前言 一.类的定义 二.具体的案例分析 1. 定义一个类 2. 类的实例化 3. 内置__init__方法 欢迎学习交流! 邮箱: z-@1-6.com 网站: htt ...

  4. python turtle画气球-如何用python的装饰器定义一个像C++一样的强

    如何用python的装饰器定义一个像C++一样的强 Python作为一个动态的脚本语言,其函数在定义时是不需要指出参数的类型,也不需要指出函数是否有返回值.使用python的装饰器来定义一个像C++那 ...

  5. python signal模块作用_如何理解python中信号Signal?

    信号signal 是python进程间进行信号发送的一种机制,其原理是操作系统对进程的控制,是一种程序中断一个进程一旦接收到信号就会打断原来的程序执行流程来处理信号. 那么singanl到底有什么用呢 ...

  6. python装饰器由浅入深_由浅入深理解Python装饰器

    前提知识: 1.Python里函数也是一种对象: def shout(word="yes"): return word.capitalize()+"!" pri ...

  7. class括号里的object_听说你在找python中class的定义及使用教程?看这里就对了

    这篇文章主要介绍了python中class的定义及使用,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下. 类的定义 class classname[(父类名)]: ...

  8. Python中函数的定义和参数传递

    前言 什么是函数,为什么它又叫做函数? 一.函数的定义 以前在中学阶段我们就学习过函数,那时的函数的定义是给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B ...

  9. python函数定义及调用-Python函数的基本定义和调用以及内置函数

    首先我们要了解Python函数的基本定义: 函数是什么? 函数是可以实现一些特定功能的小方法或是小程序.在Python中有很多内建函数,当然随着学习的深入,你也可以学会创建对自己有用的函数.简单的理解 ...

最新文章

  1. Perlin Noise
  2. 从零实现深度学习框架——深入浅出交叉熵
  3. Java基础(五):多线程
  4. 【民大Linux课件】Linux的基础操作1
  5. 阿里云ACA试题——云安全
  6. Jeecg-Boot 使用技巧
  7. zynq嵌入式linux显示logo,如何定制嵌入式linux 启动logo(小企鹅)
  8. 精神分裂症和失眠有没有关系
  9. SQL Server菜鸟入门
  10. (二十七)论文阅读 | 目标检测之MAL
  11. ROS——Teb算法的优化
  12. Biological Pathways 生物途径(通路)
  13. Qumarion 3D技术轻松建模 动漫制作更省心
  14. 从「王者荣耀」,看「产品」「运营」的博弈
  15. 2023年软著申请时间线、窍门及变化。
  16. 支付宝银行卡识别接口
  17. 美国科技巨头的寒冬正在到来,它们已失去创新能力
  18. 项目开发日报表——第二天
  19. 持续学习常用网站汇总记录(持续更新)
  20. waves服务器系统包,Waves Complete 12

热门文章

  1. 米的换算单位和公式_请问米和毫米之间的单位是怎么换算的?
  2. 文档操作---添加页码、编辑页脚
  3. Module3:Alice in Wonderland
  4. websocket连接不成功的原因
  5. 以前开发中的一些记录
  6. Meta官方吐槽大会?Connect 2022卡马克演讲全文回顾
  7. 遗传算法(确定性排挤)
  8. USB接口那么多!!你都认识吗??知道他们的区别吗??
  9. 【C++】【C++ Primer】8-IO库
  10. ROOT(a Data analysis Framework)-Note6: iSTEP day3-Random