在torch中通过DoubleTensor数字除以DoubleTensor矩阵

我试图使用 torch.Tensor 在for循环中更新一个实数矩阵。 这是我想要做的事情:

-- W 和 P 是大小为NxN的,r是大小为N的
delta_W = P * r:view(N, 1) * r:view(1, N) * P  -- 这是一个NxN的矩阵
denominator = 1 + r:view(1, N) * P * r:view(N, 1)  -- 这是一个数字
delta_W = delta_w / denominator  -- ## 这里会引发错误 ##
W = W + delta_W

澄清一下:

denom             -> [torch.DoubleTensor of size 1x1]
P,delta_W,W     -> [torch.DoubleTensor of size 200x200]

我执行除法时的错误为:

在 /usr/local/torch/pkg/torch/generic/TensorOperator.c:145 处的 '?' 的第二个错误参数(需要数字)

作为一个狂热的numpy用户,我认为“广播”可能是问题,因此我尝试使用 torch.repeatTensor(denom, N, N) 模拟它,但没有效果。如果 denom 仅仅是一个数字而不是 DoubleTensor,那么一切都工作得很好。使用这个元素也没有用, delta_P / denom[1] 会产生相同的错误。

我做错了什么?

编辑: 我尝试使用

denominator = (1 + r:view(1, N) * P * r:view(N, 1)):apply(function(x) return x^(-1) end)
delta_w = delta_w * torch.repeatTensor(denominator, N, N)

这并没有报错,但结果是错误的。要看到这一点,请尝试:

torch.linspace(0, 3, 4):view(2, 2) * torch.Tensor(2, 2):fill(0.5)
点赞
用户2978677
用户2978677

我通过使用 applyrepeatTensor 和最后的 cmul 来进行逐元素的乘法得出了结果。

rPr = r:view(1, N) * P * r:view(N, 1)
denominator = (1 + rPr):apply(function(x) return x^(-1) end)
delta_w:cmul(torch.repeatTensor(denominator, N, N))

虽然我想知道这个方法能否使用 cutorch 在 GPU 上运行。

2017-02-14 17:36:59
用户7596504
用户7596504

如果您执行 denominator[1][1],您将得到一个“数字”,而不是“torch.Tensor”。然后,您可以按照正常的除法语句编写代码。

-- W 和 P 的大小为 NxN,r 的大小为 N
delta_W = P * r:view(N, 1) * r:view(1, N) * P  -- 这是一个 NxN 的矩阵
denominator = 1 + r:view(1, N) * P * r:view(N, 1)  -- 这是一个 1x1 的矩阵
delta_W = delta_w / denominator[1][1]
W = W + delta_W

顺便说一下,在第一条语句中,您是否想要转置 P 的一个矩阵(P:t())?

2017-02-26 17:05:03