更新:2024/10/06
【PyTorch】形状の操作とブロードキャスティングについて


ふゅか
テンソルの次元の操作も面白いよね!例えば、テンソルのリサイズとか。

はるか
うん、view()メソッドを使うと形状を変更できる。
1. 形状の操作
テンソルの形状(次元)を変更する操作も頻繁に使います。リサイズや次元の追加、削除について説明します。
1.1. リサイズ(形状の変更)
view()メソッドを使うことで、テンソルの次元を自由に変更できます。例えば、2行3列のテンソルを3行2列に変換する場合は次のようにします。
import torch
tensor = torch.randn(2, 3) # ランダムな値を持つ形状 (2, 3) のテンソル
print("元の行列:\n\n",tensor,"\n\nリサイズ後:\n")
# リサイズ(形状の変更)
reshaped = tensor.view(3, 2)
print(reshaped)
reshaped = tensor.view(1, 6)
print(reshaped)
view()
メソッドはテンソルの総要素数を変えずに形状を変更するために使います。データの並びは変わらず、あくまで形状(次元)が変わるだけです。

ふゅか
データ自体はそのままで形状だけ変えるから、行列の変換とかに便利なんだよね。例えば、2行3列から3行2列、1行6列の行列に変更できるよ。

はるか
要素数が一緒になることに注意。その例だと、全部6になる。
1.2. 次元の追加と削除
次元を追加したり削除したりすることも、テンソル操作ではよくあります。例えば、unsqueeze() メソッドを使うと新しい次元を追加でき、squeeze()メソッドを使うと不要な次元を削除できます。
# 次元の追加
unsqueezed = tensor.unsqueeze(0) # 形状が (1, 2, 3) になる
print(unsqueezed)
# 次元の削除
squeezed = unsqueezed.squeeze(0) # 元の形状 (2, 3) に戻る
print(squeezed)
1.3. メソッドのまとめ
view() メソッドを使うとテンソルの形状を柔軟に変更できます。また、unsqueeze() と squeeze() を使うことで次元を追加したり削除したりできます。これらのメソッドはデータを扱いやすい形にする際に便利です。
2. ブロードキャスト
PyTorchには、異なる形状のテンソル同士で演算を行う際に、自動的に形状を調整してくれる「ブロードキャスト」という便利な機能があります。この機能により、異なる形状のテンソルでも無理なく演算を行うことができます。
a = torch.tensor([[1], [2], [3]]) # 形状 (3, 1)
b = torch.tensor([4, 5, 6]) # 形状 (3,)
# ブロードキャストによる加算
result = a + b # 形状 (3, 3)
print(result)
ここでは、a が (3, 1) の形状で、b が (3,) の形状ですが、ブロードキャストによって a の形状が (3, 3) に拡張され、要素ごとの加算が行われます。ブロードキャストはデータを効果的に処理するのに非常に役立つ機能です。

はるか
ブロードキャストも便利。形状が異なるテンソルでも演算できる。

ふゅか
そうそう!例えば、(3, 1)のテンソルと(3,)のテンソルを加算する時、自動的に形状を揃えてくれるから、わざわざ手動で調整する必要がないんだよね。