如何在 Theano 中乘以张量

How to multiply Tensors in Theano

我在 Theano 中有两个张量和一个权重矩阵。 张量 A 的维度为 (k, 5, 40)。张量 B 的维度为 (k, 5, 40)。权重矩阵 W 的维度为 (40,40)。我想计算 AWB。实现这一目标的 Theano 张量操作的正确顺序是什么?请注意,k 在 运行 时间内可能会发生变化,但其他维度是固定的。 我们希望从 AWB 得到的语义如下:

将 A 视为 k (5,40) 个矩阵的集合。叫他们 A_1, ..., A_k 将 B 视为 k (5,40) 个矩阵的集合。称他们为 B_1,...,B_k。 我们想为从 1 到 k 的所有 i 找到 A_{i} * W * B_{i}^{T}。我尝试使用 theano.tensor.dot 但它看起来很混乱。

请注意,执行此操作的一种低效方法是使用扫描功能。但这会使本质上并行的代码顺序化。

对不起,我不明白你的意思"confusing"?

我试过用小case,希望能代表你的case。在三维张量和二维矩阵之间使用 theano.tensor.dot 的点积:

import numpy as np
import theano
import theano.tensor as T

a = T.tensor3('a', dtype='int64')
c = T.matrix('c',dtype='int64')
d = T.dot(a,c)

g = theano.function([a,c],d)

x = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int)
y = np.array([[1,2],[1,3]], dtype=int)
print g(x,y)

输出:

[[[ 3  8]
  [ 4 11]]

 [[ 4 10]
  [ 2  5]]]

它的工作原理与您的逻辑一致,矩阵 c 仅在第二和第三维进行点积。

更新

上面的第一个代码,您可以在您的情况下用于第一个操作 (A*W)。不好意思我计算不仔细,当然运算后输出的是三维张量。因此,要执行 (AW)*B,您必须使用不同的方法。为了在两个三维张量之间执行乘法,我通常使用 scan:

import numpy as np
import theano
import theano.tensor as T

a = T.tensor3('a', dtype='int64')
c = T.tensor3('c',dtype='int64')
d, b = theano.scan(lambda i: T.dot(a[i,:], c[i,:]),sequences=T.arange(2))
g = theano.function([a,c],d)

x = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int)
y = np.array([[[1,2],[1,3]],[[2,2],[1,1]]], dtype=int)
print g(x,y)

我知道还有另一种使用 theano.tensor.batched_dot 的方法(theano.tensor.dot 我认为仅适用于二维和一维数组)。在您的情况下,像这样编写代码很简单:

e = T.batched_dot(a,c)
g = theano.function([a,c],e)

上面的代码给出了相同的结果。希望对你有帮助。