当前位置:  开发笔记 > 编程语言 > 正文

了解tensordot

如何解决《了解tensordot》经验,为你挑选了1个好方法。

在我学会了如何使用之后einsum,我现在正试图了解它是如何np.tensordot工作的.

但是,我有点迷失,特别是关于参数的各种可能性axes.

要理解它,因为我从未练习过张量微积分,我使用以下示例:

A = np.random.randint(2, size=(2, 3, 5))
B = np.random.randint(2, size=(3, 2, 4))

在这种情况下,有什么不同可能np.tensordot,你会如何手动计算?



1> Divakar..:

这个想法tensordot很简单 - 我们输入数组和相应的轴,沿着这些轴减少总和.参与和减少的轴在输出中被移除,并且来自输入数组的所有剩余轴在输出中展开为不同的轴,保持输入阵列的馈送顺序.

让我们看几个带有一个和两个减少轴的样本案例,并交换输入位置,看看如何在输出中保留顺序.

I.一个减少的轴

输入:

 In [7]: A = np.random.randint(2, size=(2, 6, 5))
   ...:  B = np.random.randint(2, size=(3, 2, 4))
   ...: 

情况1:

In [9]: np.tensordot(A, B, axes=((0),(1))).shape
Out[9]: (6, 5, 3, 4)

A : (2, 6, 5) -> reduction of axis=0
B : (3, 2, 4) -> reduction of axis=1

Output : `(2, 6, 5)`, `(3, 2, 4)` ===(2 gone)==> `(6,5)` + `(3,4)` => `(6,5,3,4)`

案例#2(与案例#1相同,但输入被交换):

In [8]: np.tensordot(B, A, axes=((1),(0))).shape
Out[8]: (3, 4, 6, 5)

B : (3, 2, 4) -> reduction of axis=1
A : (2, 6, 5) -> reduction of axis=0

Output : `(3, 2, 4)`, `(2, 6, 5)` ===(2 gone)==> `(3,4)` + `(6,5)` => `(3,4,6,5)`.

II.两轴减和

输入:

In [11]: A = np.random.randint(2, size=(2, 3, 5))
    ...: B = np.random.randint(2, size=(3, 2, 4))
    ...: 

情况1:

In [12]: np.tensordot(A, B, axes=((0,1),(1,0))).shape
Out[12]: (5, 4)

A : (2, 3, 5) -> reduction of axis=(0,1)
B : (3, 2, 4) -> reduction of axis=(1,0)

Output : `(2, 3, 5)`, `(3, 2, 4)` ===(2,3 gone)==> `(5)` + `(4)` => `(5,4)`

案例#2:

In [14]: np.tensordot(B, A, axes=((1,0),(0,1))).shape
Out[14]: (4, 5)

B : (3, 2, 4) -> reduction of axis=(1,0)
A : (2, 3, 5) -> reduction of axis=(0,1)

Output : `(3, 2, 4)`, `(2, 3, 5)` ===(2,3 gone)==> `(4)` + `(5)` => `(4,5)`

我们可以将它扩展到尽可能多的轴.


@ floflo29你可能知道矩阵乘法涉及元素乘法,保持轴对齐,然后沿着公共对齐轴求和元素.通过这个总和,我们正在失去那个被称为减少的共同轴,因此在简短的总和减少中.
@BryanHead使用`np.tensordot`重新排序输出轴的唯一方法是交换输入.如果它没有得到你想要的那个,`transpose`将是你要走的路.
推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有