Skip to main content

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行的数据,在函数运行后产生的新阵列中的位置,这时候会有这么两种情况:

  1. 新的行位置大于原先阵列的最大行位置。这时候,新阵列会扩充,直到行索引满足新的行索引。新添加的行,默认全部填充为0。(segment_prod函数填充为1)
  2. 若干新行的位置如果重叠怎么办?比如,第一行和第四行的位置都变为2,那么就在索引为2(也就是第三行)将它们加,显示相加以后的值
  3. 另外,TS要求segment_ids的值不能为降序。你可以是[0,0,0]或[0,0,1],不能是[2,1,1]
具体代码例子点击这里运行
其他segment_xxx函数的原理一样,就不说了。可以看代码。
所以严格说,讲这类函数称为分割相关函数不合适。

Comments

Popular posts from this blog

tf.slice用法

函数:tf.slice(inputs, begin, size, name) 作用:从列表、数组、张量等对象中抽取一部分数据 begin和size是两个多维列表,他们共同决定了要抽取的数据的开始和结束位置 begin表示从inputs的哪几个维度上的哪个元素开始抽取 ,begin基于下标0开始 size表示在inputs的各个维度上抽取的元素个数 若begin[]或size[]中出现-1,表示抽取对应维度上的所有元素 测试:如下是一个三维Tensor数据表 import tensorflow as tf import numpy as np #这个代码演示测试tf.slice函数 t=[[[1,1,1],[2,2,2]],[[3,3,3],[4,4,4]],[[5,5,5],[6,6,6]]] s1=tf.slice(t,[1,0,0],[1,1,3]) #begin=[1,0,0],表明从第1维的[0,0]开始切片,也就是从[3,3,3]开始 #size=[1,1,3]表明切片后是1维,切片的尺寸为1行3列。 s2=tf.slice(t,[0,1,1],[2,1,1]) #begin=[0,1,1],表明从第0维的[1,1]开始切片,也就是从[2,2,2]的第二个2开始 #size=[2,1,1]表明切片后是2维,切片的尺寸为1行1列。 sess=tf.Session() print(sess.run(s1)) #输出结果为 [[[3 3 3]]] ,一行三列 print(sess.run(s2)) #输出结果: [[[2]] [[4]]] #测试维度: print(sess.run(s1).shape) print(sess.run(s2).shape) #结果如下 (1, 1, 3) (2, 1, 1) 下面的立体图说明切片的实际方法: (size的大小不能大于切片刀下方表格数据的尺寸,维度数不能大于被切片数据的维度) 以s2为例

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

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

TF random_normal和Python random.normal的用法

先看TF tf.random_normal()函数用于从服从指定正太分布的数值中取出指定个数的值。 tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None) 再看NP np.random.normal()给出均值为loc,标准差为scale的高斯随机数(场). numpy.random.normal(loc=0.0, scale=1.0, size=None) 所谓正态分布==高斯分布,所以二者一回事 mean==loc==均值(或称期待值) stddev==scale==标准差 shape==size==输出形状,二者在处理这个参数时候(a,b)==[a,b],其中,np的normal对参数格式要求更灵活一些。 比如创建随机数的一行两列数组: np.random.normal([2])==np.random.normal((2))==np.random.normal(0,1,2)注意最后一种用法必须带上前面两个参数,否则传递参数时候会把2当作均值传递 而tf的random_normal对shape的要求不能是数字,必须为[]或()格式 再探究一下形状参数的规律,看下面代码 a=np.random.normal(0,1,(2,1)) b=np.random.normal(0,1,(1,2)) c=np.random.normal(0,1,(2)) print(a) print(a.shape) print(b) print(b.shape) print(c) print(c.shape) 程序输出如下 [[ 1.11843359] [-0.69801129]] (2, 1) [[-0.87110089 -0.46089345]] (1, 2) [ 0.88227522 -0.26728542] (2,) a,b是二维的矩阵,c是一维的矩阵(严格说一维的不是矩阵)