[转载]Tensorflow 的reduce_sum()函数的axis

这个问题存在三个难点:

什么是sum,什么是维度(,现在已经改成axis和numpy等包了)

求和很简单,就是求和,那么问题就是2和3,我们慢慢说。其实这个问题讲的很透彻,很多关于维度和维度的问题都会一下子浮出水面。

0. 它作用于哪个维度??

sum 的运算可以推广到任何函数。我们以 sum 为例来看看各种情况。

第一个是1维的(按照说法其实是0维的,后面会讲)是这样的:

a = 1
sum(a) => 1

然后看二维情况。为了看得更清楚,写成矩阵的形式:

a = [[1,2],
     [3,4]]
sum(a) => ???

仔细观察,那么问题来了,sum(a)应该是什么?有人说,当然是[3, 7](“横向相加”[[1+2],[3+4]]),有人说不应该是[4, 6](“纵向相加” [[1+ 3], [2+4]])?其他人说,不应该是10(全部加在一起)吗?

谁是对的?

两者都是正确的。

因此,对于多维数组元素的相加,如果不指定“如何相加”,则结果未定义。有时不指定就可以得到结果的原因是因为不同的软件或框架具有默认行为。因为,默认行为是最后一个,即全部相加。

1. 什么是维度?什么是轴?如何索引轴(轴)?

注意:对 Axis 比较熟悉的读者可以跳过这部分解释,直接看粗体字。

这是一个大问题,究竟什么是维度?维基百科说:

维数,也称为维数,是数学中独立参数的个数。在物理学和哲学领域,独立时空坐标的数量。

维度 0 是一个点,没有长度。1维是线,只有长度。2D是由长度和宽度(或曲线)形成的区域的平面。3D是2D加上高度形成一个“体积表面”。虽然普通人习惯于整数维数,但在分形中,维数不一定是整数,而可能是非整数的有理数或无理数。

天哪,太复杂了,我只想写个代码。

那么,在编程的时候,你可以简单的想:

维度是索引多维数组中特定数字所需的最小坐标数。

多读几遍这句话,我想你会有顿悟。第一个 1 维示例是 0 维的原因是一个数字根本不需要索引,因为只有一个。所有不同的维度都具有以下形式:

0维,又称0维张量,数,标量:1

一维,也称为一维张量,数组,:[1, 2, 3]

二维,又称二维张量、矩阵、二维数组:[[1,2]、[3,4]]

3维,又称3维张量、立方体、三维数组:[[[1,2]、[3,4]]、[[5,6]、[7,8]]]

n维:你应该明白了~

更多维度无非是把之前的维度当作自己的元素

1 维元素是标量,2 维元素是数组,3 维元素是矩阵。

从维度 0 到维度 3,观察并背诵口头禅“维度是索引多维数组中特定数字所需的最小坐标”。

把它写在一张纸上,你需要多少个数字才能确定一个数字?比如上例中的3维数组,我们想要数字3,至少需要3个数字进行定位,其坐标为(0为索引的起点):[0, 1, 0]

好了,现在我们可以讲一下什么是轴(axis)以及如何索引轴(代码中常用的变量名,后面会用axis来表示轴)。

什么是axis,编程的时候可以简单的想:

axis 是多维数组每一维的坐标。

同样,把这句话读几遍,我想你一定已经意识到了。

以3维为例,数字3的坐标为[0, 1, 0],那么第一个数字0的坐标轴为0,第二个数字1的坐标轴为1,第三个数字的坐标轴为0是 2 。

让我们再次看看我们是如何得到数字 3 的:

在这个 3 维立方体中找到 3 所在的 2 维矩阵的索引:0 在这个 2 维矩阵的索引处找到 3 所在的 1 维数组:1 找到数字 3 这个 1 的索引维数组:0

(最好写在纸上看看,括号比较多。)

即对于 [[[1,2], [3,4]], [[5,6], [7,8]] ], [[1,2],[[5 , 6]], [[3,4], [7,8]] 这两个矩阵的轴(记住,高维元素是低一维的,所以三维立方体的元素是二维的)是0,[1,2],[3,4],[5,6],[7,8]这4个数组的轴(二维矩阵的元素是一维array) 是 1,和 1, 2, 3, 4 , 5, 6, 7, 8, 8 个数字的轴是 2。

轴越向内越大,依次加1。

然后,对于 3 维情况,令 a = [ [[1,2], [3,4]], [[5,6], [7,8]] ], tf.(a, axis=< @1) 应该输出[[ 4, 6], [12, 14]],就是axis=1的4个数组相加,去掉一维的结果。

这里需要注意的是,axis可以为负数,表示倒数第二个轴维度,类似于list 中的用法。

那是什么?

2. 什么是

从字面上看,这个词大多被称为“减少”,但这个词技术性太强,乍一看没有意义。我更倾向于将其解释为“崩溃”,更直观。对 n 维情况执行此操作就是“折叠”执行操作的维度。还是上面tf.(a,axis=<@1)的例子,输出[[ 4, 6], [12, 14]]是二维的,显然是“折叠”了,哪个维度是折叠的? ?是要操作的维度,第二个维度,即axis=1(0-起始索引).tf.(a,axis=<@1)具体执行步骤如下:

在a中找到axis=1的元素,也就是[1,2]、[3,4]、[5,6]、[7,8]这4个数组(两组,因为前两个和后面两者状态相同)axis=1的维度相加为[1,2]+[3,4]=[4,6], [5,6]+[7,8]=[12 , 14] “折叠”这个维度,也就是“掉一层方括号”,得到 [[ 4, 6], [12, 14]]

接下来是一个额外的问题:

3. 什么是

上面已经说明了“坍塌”是被操作的维度,也就是维持维度。直观的意思是“不掉一层方括号”,哪一层方括号不能掉?它是应该折叠的层(有关详细说明,请参阅评论)。tf.(a, axis=1, =True) 得到[[[ 4, 6]], [[12, 14]]],可以看到还是3维的。这特别适用于要添加相同尺寸的其他元素的情况。

© 版权声明
THE END
喜欢就支持一下吧
点赞9赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容