我尝试使用torch.Tensor
更新for循环中的实值数字矩阵。
这就是我想要做的事情:
-- 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
要明确:
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)
我是一个沉重的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)
答案 0 :(得分:0)
我通过使用apply
,repeatTensor
和最后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。
答案 1 :(得分:0)
如果您执行denominator[1][1]
,您将获得一个号码'而不是一个火炬.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()
)吗?