gpt4 book ai didi

numpy - theano - 使用 tensordot 计算两个张量的点积

转载 作者:行者123 更新时间:2023-12-05 00:20:31 24 4
gpt4 key购买 nike

我想使用 tensordot 来计算两个张量的特定暗度的点积。喜欢:

A 是张量,其形状为 (3, 4, 5)
B 是张量,其形状为 (3, 5)

我想做一个点,使用 A 的第三个暗淡和 B 的第二个暗淡,并获得一个暗淡为 (3, 4) 的输出

像下面这样:

for i in range(3):
C[i] = dot(A[i], B[i])

如何通过 tensordot 做到这一点?

最佳答案

好吧,你想要在 numpy 中还是在 Theano 中?
在这种情况下,正如您所说,您希望将 A 的第 3 轴与 B 的第 2 轴收缩,两者都很简单:

import numpy as np

a = np.arange(3 * 4 * 5).reshape(3, 4, 5).astype('float32')
b = np.arange(3 * 5).reshape(3, 5).astype('float32')

result = a.dot(b.T)

在 Theano 中,这写为
import theano.tensor as T

A = T.ftensor3()
B = T.fmatrix()

out = A.dot(B.T)

out.eval({A: a, B: b})

但是,输出的形状为 (3, 4, 3)。由于您似乎想要形状 (3, 4) 的输出,因此 numpy 替代方案使用 einsum,如下所示
einsum_out = np.einsum('ijk, ik -> ij', a, b)

但是,Theano 中不存在 einsum。所以这里的具体情况可以模拟如下
out = (a * b[:, np.newaxis]).sum(2)

也可以用 Theano 编写
out = (A * B.dimshuffle(0, 'x', 1)).sum(2)
out.eval({A: a, B: b})

关于numpy - theano - 使用 tensordot 计算两个张量的点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34313460/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com