[解決済み] Pytorchが推奨するテンソルのコピー方法
2022-10-05 20:26:10
質問
Pytorchでテンソルのコピーを作成するには、以下のようないくつかの方法があるようです。
y = tensor.new_tensor(x) #a
y = x.clone().detach() #b
y = torch.empty_like(x).copy_(x) #c
y = torch.tensor(x) #d
b
は、明示的に
a
と
d
のどちらかを実行すると、UserWarning が表示されます。
a
または
d
. なぜそれが好まれるのでしょうか?パフォーマンス?私は可読性が低いと主張します。
を使うことに賛成/反対する理由があれば教えてください。
c
?
どのように解決するのですか?
TL;DR
使用方法
.clone().detach()
(もしくは、できれば
.detach().clone()
)
最初にテンソルをデタッチしてからクローンすると、計算パスはコピーされず、逆にコピーしてから放棄されます。このように
.detach().clone()
の方がごくわずかに効率的です --。
pytorch フォーラム
は若干高速で、何をするのかが明確なので
使用方法
perflot
を使って、pytorchテンソルをコピーする様々なメソッドのタイミングをプロットしてみました。
y = tensor.new_tensor(x) # method a
y = x.clone().detach() # method b
y = torch.empty_like(x).copy_(x) # method c
y = torch.tensor(x) # method d
y = x.detach().clone() # method e
x 軸は作成されたテンソルの次元、y 軸は時間を示す。グラフはリニアスケールである。はっきりとわかるように
tensor()
または
new_tensor()
は、他の3つの方法と比較して、より多くの時間がかかります。
注意 複数回の実行で、b, c, e のうち、どのメソッドも最も時間が短くなる可能性があることに気づきました。a と d についても同じことが言えますが、b、c、e のメソッドは一貫して a と d よりも低いタイミングになります。
import torch
import perfplot
perfplot.show(
setup=lambda n: torch.randn(n),
kernels=[
lambda a: a.new_tensor(a),
lambda a: a.clone().detach(),
lambda a: torch.empty_like(a).copy_(a),
lambda a: torch.tensor(a),
lambda a: a.detach().clone(),
],
labels=["new_tensor()", "clone().detach()", "empty_like().copy()", "tensor()", "detach().clone()"],
n_range=[2 ** k for k in range(15)],
xlabel="len(a)",
logx=False,
logy=False,
title='Timing comparison for copying a pytorch tensor',
)
関連
-
[解決済み】PyTorchで学習したモデルを保存する最適な方法とは?
-
[解決済み] PHPの配列を別の配列にコピーする関数はありますか?
-
[解決済み] PyTorchの "view "メソッドはどのように動作するのですか?
-
[解決済み] ファイルのコピー方法について教えてください。
-
[解決済み] scpを使ってリモートからローカルにフォルダをコピーするにはどうしたらいいですか?
-
[解決済み] Javaでオブジェクトをコピーするにはどうしたらいいですか?
-
[解決済み] ディープコピーとシャローコピーの違いは何ですか?
-
[解決済み] Javaでファイルをコピーする標準的な簡潔な方法?
-
[解決済み] Dockerfileのコピーでサブディレクトリ構造を維持する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン