先看一段百度的上搜索到的结果:
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行的数据,在函数运行后产生的新阵列中的位置,这时候会有这么两种情况:
其他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函数的原理一样,就不说了。可以看代码。
所以严格说,讲这类函数称为分割相关函数不合适。
Comments
Post a Comment