Skip to main content

Posts

tf.where()函数

Recent posts

tf.segment_xxx系列函数测试

先看一段百度的上搜索到的结果: TensorFlow提供了一些操作,你可以使用基本的算术运算来分割输入的tensor。这里的分割操作是沿着第一个维度的一个分区,等价于这里定义了一个从第一个维度到第segment_ids维度的一个映射。segment_ids张量的长度必须和需要分割的tensor的第一维度的尺寸d0一样,其中segment_ids中的编号从0到k,并且k < d0。举个例子,如果我们需要分割的tensor是一个矩阵,那么segment_ids的映射就指向矩阵的每一行 --------------------- 是不是看了一脸懵逼,解释了好像没解释一球样? 我来试着解释一下: 学过线性代数都知道矩阵的基础行列变换,可以相互交换行或者列,甚至可以某一行或者列乘一个数加到另外一行或者列上。说这个的原因就是segmen_xxx系列函数和这个有关。只不过是只和行变换有关。 这个系列函数包含一个重要的参数,这个参数让很多初学者懵逼:segment_ids.就是这玩意儿让我也琢磨好几十分钟。汗。智商不够只有敲代码看错误信息来搞明白它是啥意思。 加入有一个m×n的矩阵要运用segment_sum函数,那么这个参数就必须是一个一行m个元素的量,为啥不说列表或者向量呢?因为作为参数,segment_sum对他们的处理是一样的。我们也经常看到有的编码用(a,b,c),也有的代码用[a,b,c],效果一样。 segment_ids这m个数,分别代表原真阵列的1~m行的数据,在函数运行后产生的新阵列中的位置,这时候会有这么两种情况: 新的行位置大于原先阵列的最大行位置。这时候,新阵列会扩充,直到行索引满足新的行索引。新添加的行,默认全部填充为0。(segment_prod函数填充为1) 若干新行的位置如果重叠怎么办?比如,第一行和第四行的位置都变为2,那么就在索引为2(也就是第三行)将它们加,显示相加以后的值 另外,TS要求segment_ids的值不能为降序。你可以是[0,0,0]或[0,0,1],不能是[2,1,1] 具体代码例子 点击这里运行 其他segment_xxx函数的原理一样,就不说了。可以看代码。 所以严格说,讲这类函数称为分割相关函数不合适。

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

谈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.reverse反序

这个功能相当于矩阵的初等行列变换 我们看代码: import tensorflow as tf import numpy as np t=[[1,2,3],[4,5,6]] t0=tf.reverse(t,[0]) t1=tf.reverse(t,[1]) t21=tf.reverse(t,[0,1]) t22=tf.reverse(t,[1,0]) sess=tf.Session() print(sess.run(t0)) print(sess.run(t1)) print(sess.run(t21)) print(sess.run(t22)) 运行结果如下: 按行(axis=0)变换,上下行交换位置 [[4 5 6] [1 2 3]] axis=1按照横轴变换,前后列交换位置 [[3 2 1] [6 5 4]] 先纵轴变换,后横轴变换 [[6 5 4] [3 2 1]] 先横轴后纵轴变换 [[6 5 4] [3 2 1]]

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)==>(

什么是onehot编码

这么高大上的名字,顾名思义,就是在编码中只有一个1,其他是0。 眼熟吧。在Pyton神经网络编程这本书中,已经见过了。神经网络的输出中,用1000000000代表1,用01000000000代表1,以此类推,用0000000001代表9。 tf.one_hot()函数是将input转化为one-hot类型数据输出,相当于将多个数值联合放在一起作为多个相同类型的向量,可用于表示各自的概率分布,通常用于分类任务中作为最后的FC层的输出,有时翻译成“独热”编码。 tensorflow的help中相关说明如下: one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None) indices表示输入的多个数值,通常是矩阵形式;depth表示输出的尺寸。 由于one-hot类型数据长度为depth位,其中只用一位数字表示原输入数据,这里的on_value就是这个数字,默认值为1,one-hot数据的其他位用off_value表示,默认值为0。 tf.one_hot()函数规定输入的元素indices从0开始,最大的元素值不能超过(depth - 1),因此能够表示(depth + 1)个单位的输入。若输入的元素值超出范围,输出的编码均为 [0, 0 … 0, 0]。 indices = 0 对应的输出是[1, 0 … 0, 0], indices = 1 对应的输出是[0, 1 … 0, 0], 依次类推,最大可能值的输出是[0, 0 … 0, 1]。 代码示例如下: --------------------- import tensorflow as tf import numpy as np t=[0,1,2,3,4]#onehot编码数据必须是整形 #indices, depth, on_value=None, off_value=None, axis=None, dtype=None indices=t depth=5#不能小于t的长度 sess=tf.Session() on_value=1#默认是1,也可以设置为其他值,比如9 off_value=0#默认是0,也可以设置为其他数值,比如2 axis=0