【发布时间】:2017-09-01 09:28:45
【问题描述】:
我正在尝试将张量 (m, n, o) 分解为矩阵 A(m, r)、B (n, r) 和 C (k, r)。这称为 PARAFAC 分解。 Tensorly 已经进行了这种分解。
一个重要的步骤是将 A、B 和 C 相乘以获得形状为 (m, n, o) 的张量。
Tensorly 这样做如下:
def kt_to_tensor(A, B, C):
factors = [A, B, C]
for r in range(factors[0].shape[1]):
vecs = np.ix_(*[u[:, r] for u in factors])
if r:
res += reduce(np.multiply, vecs)
else:
res = reduce(np.multiply, vecs)
return res
但是,我使用的包 (Autograd) 不支持 np.ix_ 操作。因此我写了一个更简单的定义如下:
def new_kt_to_tensor(A, B, C):
m, n, o = A.shape[0], B.shape[0], C.shape[0]
out = np.zeros((m, n, o))
k_max = A.shape[1]
for alpha in range(0, m):
for beta in range(0, n):
for delta in range(0, o):
for k in range(0, k_max):
out[alpha, beta, delta]=out[alpha, beta, delta]+ A[alpha, k]*B[beta, k]*C[delta, k]
return out
然而,事实证明,这个实现也有一些 autograd 不支持的方面。但是,autograd 确实支持np.tensordot。
我想知道如何使用np.tensordot 来获得这个乘法。我认为 Tensorflow 的 tf.tensordot 也会有类似的功能。
预期的解决方案应该是这样的:
def tensordot_multplication(A, B, C):
"""
use np.tensordot
"""
【问题讨论】:
-
我对您的
ix_评论感到惊讶。很长一段时间以来,这一直是 numpy 的一部分。reduce可能需要在 PY3 中导入。 -
@hpaulj :Numpy 确实支持这些。但是,Autograd 不允许使用 .ix_ 来计算梯度。见:github.com/HIPS/autograd/issues/210
-
ix_只是进行 Divakar 的第一种方法所做的那种维度扩展。reduce应用乘法部分。 -
好的。只是 Autograd 目前不支持 ix_
-
我看了
Autograd。显然它解析了 numpy 代码,并有自己的“符号”渐变。它实际上并没有运行您的功能。ix_位于一个名为np.lib.index_tricks的文件中,并提供各种索引快捷方式,但没有新功能。
标签: python numpy tensorflow tensor scikit-tensor