web-dev-qa-db-ja.com

PyTorch-変数とテンソル間の要素ごとの乗算?

PyTorch 0.4以降、この質問は無効になりました。0.4ではTensorsとVariablesが統合されました。

PyTorchで変数とテンソルを使用して要素ごとの乗算を実行するにはどうすればよいですか? 2つのテンソルでうまく動作します。変数とスカラーを使用すると正常に動作します。しかし、変数とテンソルで要素ごとの乗算を実行しようとすると、次のようになります。

_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)
_

最初と最後の印刷ステートメントが同様の結果を示すことを期待します。最初の2つの乗算は期待どおりに機能し、3番目のエラーが発生します。 PyTorchで_*_のエイリアス(つまり、x_variable.mul(y_tensor)torch.mul(y_tensor, x_variable)など)を試しました。

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

8
golmschenk

はい。それで合っています。要素ごとの乗算(他のほとんどの演算と同様)は、_Tensor * Tensor_または_Variable * Variable_でのみサポートされていますが、_Tensor * Variable_ではnotです。

上記の乗算を実行するには、Tensorを、勾配を必要としないVariableとしてラップします。追加のオーバーヘッドはわずかです。

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

しかし、明らかに、実際にグラフによる自動微分が必要な場合は、Variablesのみを使用してください。それ以外の場合は、質問で行ったように、Tensorsに対して直接操作を実行できます。

13
mexmex