Skip to main content

tf.transpose矩阵的转置

二维矩阵的转置很简单,元素的i,j坐标交换就行。多为矩阵的转换复杂,遵循什么规律呢?
先看看代码:
import tensorflow as tf
import numpy as np
print("二维矩阵的转置\n")
t=[[1,2,3],[4,5,6]]
t1=tf.transpose(t)
t2=tf.transpose(t,[0,1])#[0,1]是正常的坐标轴排列顺序,运行结果不转置
t3=tf.transpose(t,[1,0])

sess=tf.Session()
print("Default Transepose is:\n",sess.run(t1),"\n[0,1] Tranpose is:\n",sess.run(t2),"\n[1,0] Tranpose is:\n",sess.run(t3))
print("三维矩阵的转置")
t=[[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]#这个三维矩阵有两张表格,每个表格都是2行3列
print("先测试不带perm参数的默认转置和参数顺序为不转置的正常坐标轴顺序[0,1,2]转置结果")
t1=tf.transpose(t)
t2=tf.transpose(t,[0,1,2])
print(sess.run(t1))
print(sess.run(t2))
代码输出如下:
二维矩阵的转置 Default Transepose is: [[1 4] [2 5] [3 6]] [0,1] Tranpose is: [[1 2 3] [4 5 6]] [1,0] Tranpose is: [[1 4] [2 5] [3 6]] 三维矩阵的转置 先测试不带perm参数的默认转置和参数顺序为不转置的正常坐标轴顺序[0,1,2]转置结果 [[[ 1 7] [ 4 10]] [[ 2 8] [ 5 11]] [[ 3 9] [ 6 12]]]
这里分析一下元素的坐标在转换前和转换后的变化:
1:(0,0,0)==>(0,0,0)
2:(0,0,1)==>(1,0,0)
3:(0,0,2)==>(2,0,0)
4:(0,1,0)==>(0,1,0)
5:(0,1,1)==>(1,1,0)
6:(0,1,2)==>(2,1,0)

7:(1,0,0)==>(0,0,1)
8:(1,0,1)==>(1,0,1)
9:(1,0,2)==>(2,0,1)
10:(1,1,0)==>(0,1,1)
11:(1,1,1)==>(1,1,1)
12:(1,1,2)==>(2,1,1)
从结果看出,元素的转置结果是下表数组以中心位置,对称交换,和二维矩阵原理相同。所以,默认不带参数的三维矩阵转换,其实默认的转换perm是(2,1,0),可以代码验证



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

Comments

Popular posts from this blog

神经网络(容易被忽视的基础知识)

神经网络(容易被忽视的基础知识) Evan 180 人赞了该文章 以下大多笔记主要来自cs231n和其他深度学习资料和一些我自己的补充,首先CS231n一个非常不错的deep learning课,值得一看,奉上 链接 ,然后,cs231n本身是有笔记的- 链接 ,最后,知乎上的一些大神对这个笔记进行了翻译--- 链接 。在这里,我主要是将一些重要的笔记,我认为是比较容易被我们忽视的,加上查阅其他博文,做一个笔记和心得总结! 这次主要讲解的内容有: 基本神经元 作为线性分类器的单个神经元 为什么要是深度神经网而不是”肥胖“神经网络? 为什么在人工神经网络中的神经元需要激活函数? 一些主要的激活函数 神经网络中的偏置有什么意义? 初始化神经网络的参数可以全为0吗,其他普通线性分类器呢? 交叉熵损失存在的意义和与平方差损失相比有什么好处? 神经元 下面图表的左边展示了一个生物学的神经元,右边展示了一个常用的数学模型。乍一看还是有点相似的,事实上也是,人工神经网络中的神经元也有受到生物神经元的启发。总结要点: 在生物的神经元(也就是左图)中,树突将信号传递到细胞体,信号在细胞体中相加。如果最终之和高于某个阈值,那么神经元将会 激活 ,向其轴突输出一个峰值信号, 注意这里输出是一个脉冲信号! 在数学计算模型(也就是右图)中,首先将输入 进行加权求和加上偏执 ,得到待激励值,然后将该值作为输入,输入到 激活函数 中,最后输出的是一个 激励后的值 ,这里的激活函数可以看成对生物中神经元的激活率建模。由于历史原因,激活函数常常选择使用 sigmoid函数  , 当然还有很多其他激活函数,下面再仔细聊! 需要注意: 1.一个神经元可以看成 包含两个部分 ,一个是对输入的加权求和加上偏置,一个是激活函数对求和后的激活或者抑制。2.注意生物中的神经元要复杂的多,其中一个是生物中的输出是一个脉冲,而现在大多数的数学模型神经输出的就是一个值,当然现在也有一些脉冲人工神经网络,可以自行了解! 作为线性分类器的单个神经元 比如基础的逻辑回归,结合上面的神经元知识,可以发现,逻辑回归就是激活函数是 sigmoid 的单层简单神经网络。也就是说,只要在神经元...

谈axis

Python和TF张量计算中经常见的形参,代表什么意思呢?     首先请看一下官方帮助的解释:     轴用来为超过一维的数组定义的属性,二维数据拥有两个轴:第0轴沿着行的垂直往下,第1轴沿着列的方向水平延伸。如下图     注意看,官方对于0和1的解释是轴,也就是坐标轴。而坐标轴是有方向的,所以千万不要用行和列的思维去想axis,因为行和列是没有方向的,这样想会在遇到不同的例子时感到困惑。     根据官方的说法,1表示横轴,方向从左到右;0表示纵轴,方向从上到下。当axis=1时,数组的变化是横向的,而体现出来的是列的增加或者减少。我们拿图形举个例子:     我们有一个正方形,假设是4x4的     接下来我们让他横向增加一个单位,也就是长度+1,变成了一个5x4的长方形 也就是说,对于这个4x4的正方形而言,当axis=1时,体现的是横向的长度+1,而如果这是一个4行4列的二维数组同样也是如此,但是体现出来是增加了一列。     所以其实axis的重点在于方向,而不是行和列。具体到各种用法而言也是如此。当axis=1时,如果是求平均,那么是从左到右横向求平均;如果是拼接,那么也是左右横向拼接;如果是drop,那么也是横向发生变化,体现为列的减少。 当考虑了方向,即axis=1为横向,axis=0为纵向,而不是行和列,那么所有的例子就都统一了。题主的疑问也就迎刃而解。

tf.reduce_xxx函数

#书上称这一系列为规约函数。基本上都是降维 import tensorflow as tf import numpy as np t=np.random.randint(0,3,[3,4]) sess=tf.Session() print("Test matrix is:\n",t) print("现在测试tf.reduce_sum,对tensor中的元素求和") print("tf.reduce_sum():",sess.run(tf.reduce_sum(t))) print("tf.reduce_sun(axis=0):",sess.run(tf.reduce_sum(t,axis=0))) print("tf.reduce_sun(axis=1):",sess.run(tf.reduce_sum(t,axis=1))) print("-----------------------------------------------------------------------------------------------") print("现在测试tf.reduce_prod,对tensor中的元素求乘积") print("tf.reduce_prod():",sess.run(tf.reduce_prod(t))) print("tf.reduce_prod(axis=0):",sess.run(tf.reduce_prod(t,axis=0))) print("tf.reduce_prod(axis=1):",sess.run(tf.reduce_prod(t,axis=1))) print("tf.reduce_prod(axis=0,keep_dims=True):",sess.run(tf.reduce_prod(t,axis=0,keep_dims=True))) print("tf.reduce_prod(axis=1,keep_dims=True):",sess.run(tf...