2017-02-14 80 views
0

分割一个DoubleTensor矩阵我想在更新实值数字矩阵使用torch.Tensor循环。 这里是我想要做什么:当我做除法是由DoubleTensor数量火炬

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

错误:

bad argument #2 to '?' (number expected at /usr/local/torch/pkg/torch/generic/TensorOperator.c:145) 

我是

-- W and P are of size NxN, r is of size N 
delta_W = P * r:view(N, 1) * r:view(1, N) * P -- this is an NxN 
denominator = 1 + r:view(1, N) * P * r:view(N, 1) -- this is a number 
delta_W = delta_w/denominator -- ## THIS ONE RAISES ERROR ## 
W = W + delta_W 

只是要清楚所以我认为“广播”是个问题,因此我尝试通过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) 
+0

我有感觉了智能使用的'map','map2'或'apply'会做的伎俩,但还没有想出如何。 – fabioedoardoluigialberto

+0

为什么我遇到了问题的原因之一是写[这里](https://github.com/torch/torch7/blob/master/doc/maths.md)和有关重载运算符。从DOC:“这是可能使用基本数学运算符,例如+, - ,/,*和%与张量。这些运营商为提供便利,[...]另一个需要注意的重要一点是,这些运营商而已。当第一个操作数是张量时重载,例如,这不起作用:'x = 5 + torch.rand(3)'“。 – fabioedoardoluigialberto

回答

0

我设法用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。

0

如果你做denominator[1][1],你会得到一个'数字',而不是'torch.Tensor'。然后你可以正常写分割语句。

-- W and P are of size NxN, r is of size N 
delta_W = P * r:view(N, 1) * r:view(1, N) * P -- this is an NxN 
denominator = 1 + r:view(1, N) * P * r:view(N, 1) -- this is a 1x1 
delta_W = delta_w/denominator[1][1] 
W = W + delta_W 

顺便提一下,在第一个声明没有你想调换在P矩阵(P:t())中的一个?