2017-07-02 701 views
2

如何在PyTorch中使用變量和張量執行元素乘法?兩個張量工作正常。用變量和標量運行正常。但是,試圖用一個變量和張量進行逐元素相乘,當我得到:PyTorch - 變量和張量之間的元素相乘?

XXXXXXXXXXX in mul 
    assert not torch.is_tensor(other) 
AssertionError 

例如,在運行時執行以下操作:

import torch 

x_tensor = torch.Tensor([[1, 2], [3, 4]]) 
y_tensor = torch.Tensor([[5, 6], [7, 8]]) 

x_variable = torch.autograd.Variable(x_tensor) 

print(x_tensor * y_tensor) 
print(x_variable * 2) 
print(x_variable * y_tensor) 

我希望第一個和最後一個print語句展示類似的結果。前兩次乘法運算符合預期,第三次出現錯誤。我試圖在PyTorch中使用*的別名(即x_variable.mul(y_tensor),torch.mul(y_tensor, x_variable)等)。

考慮到錯誤和產生它的代碼,似乎不支持張量和變量之間的元素相乘。它是否正確?還是有我失蹤的東西?謝謝!

回答

5

是的,你是對的。單元乘法(與大多數其他操作一樣)僅支持Tensor * TensorVariable * Variable,但不支持支持Tensor * Variable

要執行上面的乘法運算,請將Tensor作爲Variable包裝起來,不要求梯度。額外的開銷是微不足道的。

y_variable = torch.autograd.Variable(y_tensor, requires_grad=False) 
x_variable * y_variable # returns Variable 

但很明顯,只使用Variables不過,如果你確實需要通過圖自動分化。否則,您可以直接在Tensors上執行操作,就像您在問題中所做的那樣。

+0

你碰巧知道PyTorch中這個實現選擇背後的原因嗎?具體來說,爲什麼張量不是像標量一樣對待?在這兩種情況下,已知梯度不需要在它們上面,所以爲什麼不直接允許乘法?無論如何,謝謝你的回答! – golmschenk

+0

大多數操作在PyTorch中存在兩次,它們對張量執行一次,對變量執行一次。變量上的操作需要一個反向方法。因此,變量不支持不可微分操作,但可以將它們應用於張量。我認爲他們想要保持這兩個線程分開出於這個原因。變量的標量操作只是爲了方便而實現的。 – mexmex