目录

  • 前言
    • 三维情况
      • 变化一:不改变任何参数
      • 变化二:1与2交换
      • 变化三:0与1交换
      • 变化四:0与2交换
      • 变化五:0与1交换,1与2交换
      • 变化六:0与1交换,0与2交换
  • 总结
  • 写在最后

前言

本文只讨论二维三维中的permute用法

最近的Attention学习中的一个permute函数让我不理解

这个光说太抽象

我就结合代码与图片解释一下

首先创建一个三维数组小实例

import torchx = torch.linspace(1, 30, steps=30).view(3,2,5)     # 设置一个三维数组
print(x)
print(x.size())             # 查看数组的维数

这里为了防止出现维数数值相同的巧合局面(例如三维数组(3,3,3)或者(2,4,4)等)

输出结果如下图

一般的把(3,2,5)解释为3维2行5列这里很容易让人迷迷糊糊

那么我们按照块,行,列理解起来会更容易一些

比如(3,2,5),表示3块 2*5的数组

以下我简单用3块3*3图偷懒举例

然后堆起来就是我们熟知的三维矩阵

接下来先简单介绍下permute()函数

permute(dims)
参数dims用矩阵的维数代入,一般默认从0开始。即第0维,第1维等等
也可以理解为,第0块,第1块等等。当然矩阵最少是两维才能使用permute
如是两维,dims分别为是0和1
可以写成permute(0,1)这里不做任何变化,维数与之前相同
如果写成permute(1,0)得到的就是矩阵的转置
如果三维是permute(0,1,2)
0代表共有几块维度:本例中0对应着3块矩阵
1代表每一块中有多少行:本例中1对应着每块有2行
2代表每一块中有多少列:本例中2对应着每块有5列
所以是3块2行5列的三维矩阵
这些0,1,2并没有任何实际的意义,也不是数值,只是用来标识区别。有点类似于x,y,z来区分三个坐标维度,是人为规定好的
三维情况直接用下面的代码来给大家讲解

三维情况

变化一:不改变任何参数
b = x.permute(0,1,2)            # 不改变维度
print(b)
print(b.size())

发现此时矩阵没有变化,依然是按照之前的方式排列

变化二:1与2交换
b = x.permute(0,2,1)             # 每一块的行与列进行交换,即每一块做转置行为
print(b)
print(b.size())

两张图片可以比较

在不改变每一块(即)的前提下,对每一块的行列进行对调(即二维矩阵的转置)

变化三:0与1交换
b = x.permute(1,0,2)            # 交换块和行
print(b)
print(b.size())

两者比较可以看出块数和每块的行数发生了变化

即参数0对应的数值3块变成2块

参数1对应的2行变成3行

这个变化刚好是0与1 的位置交换,导致参数进行对调

此时变成了2块 * 3行 * 5列(初始为3块 * 2行 *5列)

变化四:0与2交换
b = x.permute(2,1,0)            # 交换块和列
print(b)
print(b.size())

此时参数0对应的3块经过permute已经变成了5块
参数2对应的5列已经变成了3列

变化五:0与1交换,1与2交换
b = x.permute(2,0,1)            # 交换块和行和列
print(b)
print(b.size())



此时参数0对应的3块变成了5块
参数1对应的2行变成了3行
参数2对应的5列变成了2列

变化六:0与1交换,0与2交换
b = x.permute(1,2,0)            # 交换块和行和列
print(b)
print(b.size())


此时参数0对应的3块变成了2块
参数1对应的2行变成了5行
参数2对应的5列变成了3列

总结

根据以上举得二维和三维例子可以知道permute()函数其实是对矩阵的块行列进行交换

里面的参数并不是具体数值

而是块行列的代指

写在最后

没想随手写的一篇居然这么多读者关注

我又在此篇文章的基础上,详细的解释了维度变化过程

能够更好的帮助大家理解permute函数的用法

进阶文章请戳我

torch中permute()函数用法相关推荐

  1. Matlab中repmat、permute函数用法

    repmat函数用法 复制和平铺矩阵 函数repmat 格式:  B = repmat(A, m, n) %将矩阵A复制m*n块,即B由m*n块A平铺而成 B = repmat(A, [m n])%与 ...

  2. python中permute_PyTorch中permute的用法详解

    PyTorch中permute的用法详解 permute(dims) 将tensor的维度换位. 参数:参数是一系列的整数,代表原来张量的维度.比如三维就有0,1,2这些dimension. 例: i ...

  3. MATLAB中repmat函数用法

    1.语法 · 函数repmat B = repmat(A, m, n) %将矩阵A复制m*n块,即B由m*n块A平铺而成 B = repmat(A, [mn])%与上面一致 B = repmat(A, ...

  4. php foreach嵌套foreach,php中foreach怎么嵌套foreach PHP中foreach函数用法?

    foreach的使用方法小编不是很明确,分享达人指教一下.foreach (array_expressforeach($array as $key) { if(xxxx) { break; //bre ...

  5. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  6. python print函数用法_Python3.2中Print函数用法实例详解

    本文实例讲述了Python3.2中Print函数用法.分享给大家供大家参考.具体分析如下: 1. 输出字符串 >>> strHello = 'Hello World' >> ...

  7. format函数python的顺序_[转载] Python中format函数用法

    Python中format函数用法 format优点 format是python2.6新增的格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能 ...

  8. php使用referer,php中HTTP_REFERER函数用法实例

    本文实例分析了php中HTTP_REFERER函数用法.分享给大家供大家参考.具体分析如下: 利用php的http_referer函数来判断用户的来路,这是比较简单的,实例代码如下: if (isse ...

  9. php中 param,php中bind_param()函数用法分析

    本文实例讲述了php中bind_param()函数用法.分享给大家供大家参考,具体如下: 从字面上不难理解,绑定的参数:下面我通过一个绑定参数的例子讲一下: for example: bind_par ...

  10. php中strtotime的意思,php中strtotime函数用法详解

    本文实例讲述了php中strtotime函数用法.分享给大家供大家参考.具体如下: strtotime(字符串$时间[,诠释$现在])int strtotime(string $time [,int ...

最新文章

  1. Go中有一个foreach循环吗?
  2. Javascript高级程序设计——基本类型和引用类型的值
  3. Linux 进程后台运行的几种方式 screen
  4. 小程序服务器七牛云,基于七牛云 API 开发的微信小程序 SDK
  5. ICE专题:ICE简介
  6. Mysql 备份和还原
  7. eclipse-阶段五- 在[vo.BookMessageData]类型bean中找不到任何有关属性[Total]的信息
  8. mysql中order by的原理
  9. Linux 镜像文件ISO下载
  10. 整数拼接(记忆化更新)
  11. php计算qqbkn,js解密之QQ的bkn值,获取QQ群成员信息,获取QQ好友列表信息
  12. 程序员如何摆脱天天CRUD这种打杂状态?
  13. java中文转换数字_Java 中文数字转换为阿拉伯数字
  14. linux http status404,解决问题:HTTP Status 404(The requested resource is not avail
  15. 力天创见客流热区图分析
  16. 数字图像处理 拉普拉斯(Laplace)变换 边缘检测算子(二阶导 sobel)变换 锐化(反锐化模板锐化) 算法实现及效果
  17. 投稿经验分享之五:申请专利
  18. 坦克小战的游戏规则说明(3)
  19. 计算机网络中 冲突域、广播域
  20. 无法加载xxx.dll文件,找不到指定的模块(异常来自HRESULT:0x8007007E)解决

热门文章

  1. mac 安装mysql 找不到_mac安装mysql遇到的坑
  2. python标准库math中用来计算平方根的函数是_Python程序设计的复习题资料合集免费下载...
  3. php paypal ipn返回验证,Paypal IPN检测退款,PHP
  4. c语言C的ascii码是多少,c的ascii码值是多少
  5. dataframe 如何选中某列的一行_Spark中的RDD、DataFrame和DataSet讲解
  6. centos wget默认路径_TRMM 数据windows平台wget下载方法(2021年1月13日可用)
  7. python unrar问题_Python提取/unrar RAR文件错误
  8. python 城市地图_使用底图获取城市地图的最佳方法? - python
  9. 第一冲刺阶段意见汇总
  10. 小程序WXML 使用小结