在 3D theano 张量上广播 linalg.pinv

broadcasting linalg.pinv on a 3D theano tensor

在下面的示例中,有一个大小为 (4, 3, 3) 的 3d numpy 矩阵 + 关于如何在 numpy 中计算这 3*3 矩阵中的 4 个中的每一个的 pinv 的解决方案。我还尝试使用在 numpy 中工作的相同功能,在 theano 中希望它实现相同,但它失败了。知道如何在 theano 中做到这一点吗?

dt = np.dtype(np.float32)

a=[[[12,3,1],
   [2,4,1],
   [2,4,2],],
   [[12,3,3],
   [2,4,4],
   [2,4,5],],
   [[12,3,6],
   [2,4,5],
   [2,4,4],],
   [[12,3,3],
   [2,4,5],
   [2,4,6]]]

a=np.asarray(a,dtype=dt)
print(a.shape)

apinv=np.zeros((4,3,3))
print(np.linalg.pinv(a[0,:,:]).shape)

#numpy solution
apinv = map(lambda n: np.linalg.pinv(n), a)
apinv = np.asarray(apinv,dtype=dt)

#theano solution (not working)
at=T.tensor3('a')
apinvt = map(lambda n: T.nlinalg.pinv(n), at)

错误是:

Original exception was:
Traceback (most recent call last):
  File "pydevd.py", line 2403, in <module>
    globals = debugger.run(setup['file'], None, None, is_module)
  File "pydevd.py", line 1794, in run
    launch(file, globals, locals)  # execute the script
  File "exp_thn_pinv_map.py", line 35, in <module>
    apinvt = map(lambda n: T.nlinalg.pinv(n), at)
  File "theano/tensor/var.py", line 549, in __iter__
    raise TypeError(('TensorType does not support iteration. '
TypeError: TensorType does not support iteration. Maybe you are using builtin.sum instead of theano.tensor.sum? (Maybe .max?)

错误信息是

Traceback (most recent call last):
  File "D:/Dropbox/source/intro_theano/pinv.py", line 32, in <module>
    apinvt = map(lambda n: T.nlinalg.pinv(n), at)
  File "d:\dropbox\source\theano\theano\tensor\var.py", line 549, in __iter__
    raise TypeError(('TensorType does not support iteration. '
TypeError: TensorType does not support iteration. Maybe you are using builtin.sum instead of theano.tensor.sum? (Maybe .max?)

发生这种情况是因为,如错误消息所示,符号变量 at 不可迭代。

这里的根本问题是您错误地将立即执行的 Python 代码与延迟执行的 Theano 符号代码混合在一起。

您需要使用符号循环,而不是 Python 循环。正确的解决方案是使用 Theano 的 scan 运算符:

at=T.tensor3('a')
apinvt, _ = theano.scan(lambda n: T.nlinalg.pinv(n), at, strict=True)
f = theano.function([at], apinvt)
print np.allclose(f(a), apinv)