Depuis PyTorch 0.4, cette question n'est plus valide. Dans 0.4 Tensor
s et Variable
s ont été fusionnés.
Comment puis-je effectuer une multiplication élément par élément avec une variable et un tenseur dans PyTorch? Avec deux tenseurs fonctionne très bien. Avec une variable et un scalaire fonctionne très bien. Mais lorsque j'essaie d'effectuer une multiplication par élément avec une variable et un tenseur, j'obtiens:
XXXXXXXXXXX in mul
assert not torch.is_tensor(other)
AssertionError
Par exemple, lors de l'exécution des éléments suivants:
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)
Je m'attendrais à ce que les première et dernière déclarations imprimées montrent des résultats similaires. Les deux premières multiplications fonctionnent comme prévu, l'erreur remontant dans la troisième. J'ai essayé les alias de *
Dans PyTorch (c'est-à-dire x_variable.mul(y_tensor)
, torch.mul(y_tensor, x_variable)
, etc.).
Il semble que la multiplication par élément entre un tenseur et une variable ne soit pas supportée étant donné l'erreur et le code qui la produit. Est-ce correct? Ou y a-t-il quelque chose qui me manque? Je vous remercie!
Oui vous avez raison. La multiplication élément par élément (comme la plupart des autres opérations) n'est prise en charge que pour Tensor * Tensor
ou Variable * Variable
, mais pas pour Tensor * Variable
.
Pour effectuer votre multiplication ci-dessus, enveloppez votre Tensor
comme un Variable
qui ne nécessite pas de dégradés. Les frais généraux supplémentaires sont insignifiants.
y_variable = torch.autograd.Variable(y_tensor, requires_grad=False)
x_variable * y_variable # returns Variable
Mais évidemment, n'utilisez que Variables
, si vous avez réellement besoin d'une différenciation automatique via un graphique. Sinon, vous pouvez simplement effectuer l'opération sur le Tensors
directement comme vous l'avez fait dans votre question.