web-dev-qa-db-fra.com

PyTorch - Multiplication élément par élément entre une variable et un tenseur?

Depuis PyTorch 0.4, cette question n'est plus valide. Dans 0.4 Tensors et Variables 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!

8
golmschenk

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.

13
mexmex