2017-07-02 57 views
2

PyTorchで変数とテンソルを使って要素ごとに乗算を実行するにはどうすればよいですか? 2つのテンソルでうまく動作します。変数とスカラーがうまく動作します。変数とテンソルで要素単位の乗算を実行しようとすると、しかし、私は得る:例えば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文を期待します同様の結果。最初の2回の乗算は期待どおりに動作し、3回目にエラーが発生します。私はPyTorchで*のエイリアスを試みました(すなわち、x_variable.mul(y_tensor)torch.mul(y_tensor, x_variable)など)。

テンソルと変数の間の要素ごとの乗算は、エラーとそれを生成するコードを考慮してサポートされていないようです。これは正しいです?それとも私は行方不明のものがありますか?ありがとうございました!

答えて

5

はい、正しいです。 (ほかのほとんどの演算と同様に)要素単位の乗算は、Tensor * TensorまたはVariable * 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に2回存在し、Tensorsに対して1回、Variablesに対して1回実装されています。変数の操作では、逆方向メソッドが必要です。したがって、微分不可能な演算は変数でサポートされていませんが、テンソルに適用できます。この理由から、これらの2つのスレッドを分離しておきたいと思っています。変数のスカラー演算は便宜上実装されているだけです。 – mexmex

関連する問題