对keras.permute_dimensions和numpy.transpose空间维度转置过程的理解(Axis的理解)

本文主要是介绍对keras.permute_dimensions和numpy.transpose空间维度转置过程的理解(Axis的理解),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

keras.permute_dimensions和numpy.transpose,这两个函数的作用是对矩阵进行维度的转置, 具体请参考官方文档,这里只给出矩阵维度转置是怎么理解的?

1. 写在前面

今天遇到一个时间序列分析的任务,使用了Attention机制,看代码之后,有几个空间转置的过程其实有点懵。

所以通过查资料理解了一下空间维度转置,顺便理解了一下三维矩阵的沿着某一个轴的加法,我把自己的理解技巧记录下来,不一定适合每个人,但是如果这样看待转置问题的话,应该知道具体是怎么变的一个过程。

如果你还没明白我说啥,那么我可以举个例子:

A=np.arange(12).reshape([2,3,2])
X=tf.transpose(A,[0,2,1])
Y=tf.transpose(A,[1,0,2])

通过这三行代码,你能一下子反应出X和Y的形状和具体的数值吗?

如果不能,那么我告诉你结果:

A长这个样子, 是一个[2, 3, 2]的三维矩阵

[[[ 0  1][ 2  3][ 4  5]][[ 6  7][ 8  9][10 11]]]

X是把A的后两个维度进行了转置, X的大小:[2,2,3], 长这个样子:

[[[ 0  2  4][ 1  3  5]][[ 6  8 10][ 7  9 11]]]

Y是把A的前两个维度进行了转置,Y的大小:[3,2,2], 长这个样子:

[[[ 0  1][ 6  7]][[ 2  3][ 8  9]][[ 4  5][10 11]]]

我们可以发现,判断三维矩阵转置后的形状还是比较好判断的, 无非就是原来的维度大小,转换对应即可。 但是具体的样子我们理解是怎么变过去的吗?

并且如果我两个三维矩阵相加的时候,你能一下子反应出axis=0, 1, -1都是在哪个维度上进行拼接的吗?

 # 三维数组  t3 = tf.constant([[[1, 2], [2, 3]], [[4, 4], [5, 3]]])t4 = tf.constant([[[7, 4], [8, 4]], [[2, 10], [15, 11]]])with tf.Session() as sess:# 三维数组针对 axis 为0 和 1 和 -1 的情况print(sess.run(tf.concat([t3, t4], 0)))print(sess.run(tf.concat([t3, t4], 1)))print(sess.run(tf.concat([t3, t4], -1)))

这两个就是我今天分享的,应该怎么理解这个转置的过程和拼接的过程。我这里分享一下我的理解方法,我是通过固定数据,转换视角来理解的, 下面具体说说是什么意思?

2. 三维? 我们还是先从二维来来理解

对于二维矩阵的转置,我相信肯定大家都理解是怎么转的, 比如下面的例子:

A = np.array([[1, 2, 3], [4, 5, 6]])
X = tf.transpose(A, [1, 0])      # 这个地方其实是0维和1维进行了交换

这个我们很容易就会得出答案, A的转置矩阵就是:
[[1 4]
[2 5]
[3 6]]
在这里插入图片描述
这个应该大家都会做,但是具体的转变过程,可能我们每个人理解的就不一样了,可能有的人是固定轴,变数字,也有的人固定数字,转变轴。 我就是后者,我对于二维转置问题是这样理解的, 对于二维矩阵来说,我们知道会有axis=0, axis=1两个轴,如果你经常使用numpy和pandas的话,对我说的这一点肯定不陌生,毕竟矩阵拼接, sum加和这些操作都有个axis的属性。 这个其实就是二维矩阵的两个方向,类似x,y轴一般。我的理解是这样子的,横向是axis=1, 纵向是axis=0。
在这里插入图片描述
如果你也是这样理解的话,恭喜你,对于二维矩阵的拼接求和,其实就很好理解了,比如np.sum(a, axis=0) 我们很容易就理解这是沿着axis=0的方向加和,结果就是[5, 7, 9], np.sum(a, axis=1), 很容易理解是axis=1的方向加和, 结果[6, 15]。 当然np.concat, 还有pandas的拼接操作都是同理。

这两个轴的目的是锁定视角,就是我观察的角度永远是这个角度(axis=0朝下,axis=1朝着右)

那么这种情况下,做转置怎么理解呢? 我依然是数字不变,观察的角度进行变换, 但是这个观察的角度怎么变的呢? 依赖于这两个轴。 当然只是轴哈,如果轴有含义的话,比如axis=0方向代表样本, axis=1代表特征这种,含义可不能变,只是变个观察的角度罢了。 啥意思呢?

二维转置,其实就是axis=0和axis=1交换一下位置,然后再回到我axis=0朝下, axis=1朝右的视角下观察这个矩阵, 如下图:
在这里插入图片描述
这个转变视角的过程,其实相当于我们人走到了这个矩阵的后面,然后头顺时针旋转90度观察的(你可以发挥空间想象力,想象一下这个过程)。

有人可能有疑问,为啥要这么麻烦,我直接数字变一下子不就完了? 嗯嗯, 当然可以,哪个好理解用哪个, 我之所以用后者,是因为三维的情况下,变数字可就不是那么好变了, 不信? 我们就看看三维的情况。

3. 三维下的矩阵转置

我们就看下面这个简单的例子吧:
在这里插入图片描述
这是一个[2, 3, 4]大小的矩阵,如果我要问,前两个轴(01)交换,你能一下子反应出下面的这个图片吗?
在这里插入图片描述
这个转置对应numpy就是np.transpose(x, (1, 0, 2)),,对应keras就是keras.backend.permute_dimensions(x, (1, 0, 2))。

反正我如果是从变换数字的角度看的话,反应不出后面的结果,即使看了一篇博客的描述,也是得寻思半天。 但是如果数字不变,角度变换的技巧理解的话,这个问题就容易想了。

三维的里面,我依然是借助轴的,只不过这次需要三个,并且0,1, 2的方向得是下面这样子:
在这里插入图片描述
并且,三个轴的方向不能变,只能从这个视角看待矩阵,这样的话,我们上面的01轴交换位置,就是这样子:
在这里插入图片描述
这个时候,就转换角度,想办法让axis=0朝里,axis=1朝下,axis=2朝右, 就相当于从矩阵的后面爬到上面,然后从右往左看就是最终的结果。或者爬到上面,把矩阵沿着axis=2的方向逆序一下子(就相当于朝右了),也是最终的结果。

OK, 如果没懂的话可以再看一个:
在这里插入图片描述
这次是后两个轴进行交换,我的理解依然是换坐标轴先,(12)交换,
在这里插入图片描述
然后同样是想办法换成原来的观察视角(axis=0朝里,axis=1朝下, axis=2朝右), 即跑到矩阵的后面,然后头顺时针转90度,然后沿着axis=0的方向逆序一下看就是最后的结果。其实说的这么麻烦,只要领悟了这个方式,用空间想象就能够很轻松的想出是怎么变的。

下面这个0和2交换的,就不说了,自己可以标出坐标轴试一下子:
在这里插入图片描述
跑到右边,然后沿着axis=0逆序一下看,就得到最终结果。
在这里插入图片描述
只要明白了这个原理,其他的情况也都一样了, 其他的情况可以看
三维视图详解keras.permute_dimensions和numpy.transpose转置效果

哈哈,其实还是挺好玩的, 明白了这个视角的角度,也可以试一下axis=0,1,2的三维矩阵加法如何理解Axis?

最后说明一点, 其实这里为了看一下空间矩阵维度的变化细节才记录这个技巧的,其实在在真正的编程上,我们遇到的矩阵行数列数通道数等很多,我们根本没法去具体想象究竟是怎么去算的,并且一般我们实际的矩阵每个方向都有含义,比如[batchsize, time_step, seq_len]这种,转换的时候,我们只要理解是哪个维度的含义和哪个维度转就可以了,一般后两个转[batchsize, seq_len, time_step]这样,这样就基本上能看明白矩阵乘法以及矩阵乘法的含义了。 所以实际情况下不用理解那么细致。

最后就是要注意,上面那种技巧只是换了个角度去看矩阵,如果原来方向上都有特殊含义,可千万不要把特征含义给换了,只换axis帮助你纠正角度就可以。

这篇关于对keras.permute_dimensions和numpy.transpose空间维度转置过程的理解(Axis的理解)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/736258

相关文章

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

深入理解RxJava:响应式编程的现代方式

在当今的软件开发世界中,异步编程和事件驱动的架构变得越来越重要。RxJava,作为响应式编程(Reactive Programming)的一个流行库,为Java和Android开发者提供了一种强大的方式来处理异步任务和事件流。本文将深入探讨RxJava的核心概念、优势以及如何在实际项目中应用它。 文章目录 💯 什么是RxJava?💯 响应式编程的优势💯 RxJava的核心概念

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

Solr 使用Facet分组过程中与分词的矛盾解决办法

对于一般查询而言  ,  分词和存储都是必要的  .  比如  CPU  类型  ”Intel  酷睿  2  双核  P7570”,  拆分成  ”Intel”,”  酷睿  ”,”P7570”  这样一些关键字并分别索引  ,  可能提供更好的搜索体验  .  但是如果将  CPU  作为 Facet  字段  ,  最好不进行分词  .  这样就造成了矛盾  ,  解决方法