2017-07-02 3 views
2

Comment effectuer une multiplication par éléments avec une variable et un tenseur dans PyTorch? Avec deux tenseurs fonctionne bien. Avec une variable et un scalaire fonctionne bien. Mais lors d'une tentative d'effectuer une multiplication élément par élément avec une variable et tenseur je reçois:PyTorch - Multiplication par élément entre une variable et un tenseur?

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

Par exemple, lors de l'exécution de ce qui suit:

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 me attends les première et dernière déclarations d'impression à émission résultats similaires. Les deux premières multiplications fonctionnent comme prévu, avec l'erreur à venir dans le 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éments 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!

Répondre

5

Oui, vous avez raison. La multiplication par éléments (comme la plupart des autres opérations) n'est prise en charge que pour Tensor * Tensor ou Variable * Variable, mais et non pour Tensor * Variable. Pour effectuer la multiplication ci-dessus, enveloppez votre Tensor comme Variable qui ne nécessite pas de dégradé. Le surcoût supplémentaire est insignifiant.

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

Mais de toute évidence, utilisez uniquement Variables cependant, si vous avez réellement besoin de différenciation automatique par un graphique. Sinon, vous pouvez simplement effectuer l'opération sur le Tensors directement comme vous l'avez fait dans votre question.

+0

Connaissez-vous le raisonnement derrière ce choix d'implémentation dans PyTorch? Plus précisément, pourquoi le tenseur n'est-il pas traité comme le scalaire? Dans les deux cas, on sait que les gradients ne sont pas nécessaires, alors pourquoi la multiplication n'est-elle pas permise directement? En tout cas, merci pour la réponse! – golmschenk

+0

La plupart des opérations existent deux fois dans PyTorch, elles sont implémentées une fois pour les Tensors et une fois pour les Variables. Les opérations sur les variables nécessitent une méthode arrière. Par conséquent, les opérations non différentiables ne sont pas prises en charge par les variables, mais vous pouvez les appliquer aux tenseurs. Je pense qu'ils voulaient garder ces deux fils séparés pour cette raison. Et les opérations scalaires sur les variables sont simplement implémentées pour plus de commodité. – mexmex