PyTorch torch.reshape 関数
torch.reshapeは PyTorch でテンソルの形状を変更するための関数です。元のテンソルと同じ要素数を持ち、形状が異なる新しいテンソルを返します。
これは、データの形状を調整してさまざまな層の入力要件に適合させるため、深層学習で非常に頻繁に使用される操作です。
関数定義
torch.reshape(input, shape)
パラメータ:
input(Tensor): 入力テンソル。shape(tuple または int): 目標の形状。形状内の要素数は入力テンソルの要素数と同じである必要があります。-1PyTorch に次元を自動推論させることができます。
戻り値:
torch.Tensor: 形状が変更されたテンソルのビューを返します。
使用例
例1: 1次元テンソルを2次元にreshape
サンプル
import torch
# 1次元テンソルを作成
x = torch.arange(12)
print("元の形状:", x.shape)
print(x)
# 3x4 の2次元テンソルに変更
y = torch.reshape(x, (3, 4))
print("新しい形状:", y.shape)
print(y)
# 1次元テンソルを作成
x = torch.arange(12)
print("元の形状:", x.shape)
print(x)
# 3x4 の2次元テンソルに変更
y = torch.reshape(x, (3, 4))
print("新しい形状:", y.shape)
print(y)
出力結果:
原始形状: torch.Size([12])
tensor([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])
新形状: torch.Size([3, 4])
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
例2: -1 を使用して次元を自動推論
サンプル
import torch
# 3次元テンソルを作成
x = torch.randn(2, 3, 4)
print("元の形状:", x.shape)
# -1 を使用して最後の次元を自動推論
y = torch.reshape(x, (2, -1))
print("新しい形状:", y.shape)
# 3次元テンソルを作成
x = torch.randn(2, 3, 4)
print("元の形状:", x.shape)
# -1 を使用して最後の次元を自動推論
y = torch.reshape(x, (2, -1))
print("新しい形状:", y.shape)
出力結果:
原始形状: torch.Size([2, 3, 4]) 新形状: torch.Size([2, 12])
例3: 2次元にフラット化
サンプル
import torch
# 4次元テンソルを作成(典型的なバッチ画像データ)
x = torch.randn(32, 3, 224, 224) # バッチサイズ 32、チャンネル 3、高さ幅 224
print("元の形状:", x.shape)
# (バッチサイズ, その他) にフラット化
y = torch.reshape(x, (32, -1))
print("フラット化後の形状:", y.shape)
# 4次元テンソルを作成(典型的なバッチ画像データ)
x = torch.randn(32, 3, 224, 224) # バッチサイズ 32、チャンネル 3、高さ幅 224
print("元の形状:", x.shape)
# (バッチサイズ, その他) にフラット化
y = torch.reshape(x, (32, -1))
print("フラット化後の形状:", y.shape)
出力結果:
原始形状: torch.Size([32, 3, 224, 224]) 展平后形状: torch.Size([32, 150528])
これは、画像データを全結合層に入力する前に頻繁に使用されます。
例4: reshape と view の違い
サンプル
import torch
# 連続テンソルを作成
x = torch.arange(12).reshape(3, 4)
# reshape はビューまたはコピーを返す可能性があります
y = torch.reshape(x, (4, 3))
print("y は x のビュー:", y.is_contiguous() or y.data_ptr() == x.data_ptr())
# 連続テンソルを作成
x = torch.arange(12).reshape(3, 4)
# reshape はビューまたはコピーを返す可能性があります
y = torch.reshape(x, (4, 3))
print("y は x のビュー:", y.is_contiguous() or y.data_ptr() == x.data_ptr())
torch.reshapeは非連続テンソルを処理できますが、tensor.view()はテンソルが連続である必要があります。
注意事項
torch.reshape返されるテンソルは、メモリレイアウトによって元のデータのビュー(view)またはコピー(copy)になる場合があります。- ビューを返すことを保証する必要がある場合は、
tensor.view()を使用できますが、テンソルが連続であることを確認する必要があります。 - 形状の総要素数は、元のテンソルの要素数と同じでなければなりません。
その他の拡張
Pytorch torch リファレンスマニュアル