PyTorch torch.cat 関数
torch.catPyTorch で指定した次元に沿って複数のテンソルを連結するための関数です。複数のテンソルを指定した次元に沿って結合し、より大きなテンソルにします。
これは深層学習で非常に頻繁に使われる操作で、例えば特徴マップの連結やデータバッチの結合などの場面で使用されます。
関数定義
torch.cat(tensors, dim=0, out=None)
パラメータ:
tensors(Sequence of Tensor): 連結するテンソルのシーケンス。すべてのテンソルは、連結する次元以外の次元において形状が同一である必要があります。dim(int, オプション): 連結する次元。デフォルトは 0 です。out(Tensor, オプション): 出力テンソル。
戻り値:
torch.Tensor: 連結後のテンソルを返します。
使用例
例 1: 最初の次元に沿って連結
サンプル
import torch
# 2つのテンソルを作成
a = torch.randn(2, 3)
b = torch.randn(2, 3)
# 最初の次元(行)に沿って連結
c = torch.cat([a, b], dim=0)
print("a の形状:", a.shape)
print("b の形状:", b.shape)
print("c の形状:", c.shape)
print(c)
# 2つのテンソルを作成
a = torch.randn(2, 3)
b = torch.randn(2, 3)
# 最初の次元(行)に沿って連結
c = torch.cat([a, b], dim=0)
print("a の形状:", a.shape)
print("b の形状:", b.shape)
print("c の形状:", c.shape)
print(c)
出力結果は次のとおりです:
a 的形状: torch.Size([2, 3])
b 的形状: torch.Size([2, 3])
c 的形状: torch.Size([4, 3])
tensor([[ 0.2532, 0.3643, 0.5341],
[ 0.9578, 0.9086, -0.2847],
[-0.7108, -0.0142, 0.7168],
[-0.1542, -0.9841, -1.4945]])
例 2: 2番目の次元に沿って連結
サンプル
import torch
# 2つのテンソルを作成
a = torch.randn(2, 3)
b = torch.randn(2, 4)
# 2番目の次元(列)に沿って連結
c = torch.cat([a, b], dim=1)
print("a の形状:", a.shape)
print("b の形状:", b.shape)
print("c の形状:", c.shape)
# 2つのテンソルを作成
a = torch.randn(2, 3)
b = torch.randn(2, 4)
# 2番目の次元(列)に沿って連結
c = torch.cat([a, b], dim=1)
print("a の形状:", a.shape)
print("b の形状:", b.shape)
print("c の形状:", c.shape)
出力結果は次のとおりです:
a 的形状: torch.Size([2, 3]) b 的形状: torch.Size([2, 4]) c 的形状: torch.Size([2, 7])
例 3: 複数のテンソルを連結
サンプル
import torch
# 複数のテンソルを作成
a = torch.tensor([1, 2])
b = torch.tensor([3, 4])
c = torch.tensor([5, 6])
# 複数のテンソルを連結
result = torch.cat([a, b, c])
print(result)
# 複数のテンソルを作成
a = torch.tensor([1, 2])
b = torch.tensor([3, 4])
c = torch.tensor([5, 6])
# 複数のテンソルを連結
result = torch.cat([a, b, c])
print(result)
出力結果は次のとおりです:
tensor([1, 2, 3, 4, 5, 6]) </p> <h3>示例 4: 在神经网络中拼接特征</h3> <div class="example"> <h2 class="example">实例</h2> <div class="example_code"> <span style="color: Green;font-weight:bold;">import</span> torch<br /> <br /> <span style="color: #a50"># 模拟来自不同层的特征图</span><br /> feature1 <span style="color: Gray;">=</span> torch.<span style="color: #05a;">randn</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;">,</span> <span style="color: Maroon;">64</span><span style="color: Gray;">,</span> <span style="color: Maroon;">32</span><span style="color: Gray;">,</span> <span style="color: Maroon;">32</span><span style="color: Olive;">)</span> <span style="color: #a50"># 来自第一层的特征</span><br /> feature2 <span style="color: Gray;">=</span> torch.<span style="color: #05a;">randn</span><span style="color: Olive;">(</span><span style="color: Maroon;">1</span><span style="color: Gray;">,</span> <span style="color: Maroon;">128</span><span style="color: Gray;">,</span> <span style="color: Maroon;">32</span><span style="color: Gray;">,</span> <span style="color: Maroon;">32</span><span style="color: Olive;">)</span> <span style="color: #a50"># 来自第二层的特征</span><br /> <br /> <span style="color: #a50"># 在通道维度(dim=1)拼接特征</span><br /> combined <span style="color: Gray;">=</span> torch.<span style="color: #05a;">cat</span><span style="color: Olive;">(</span><span style="color: Olive;">[</span>feature1<span style="color: Gray;">,</span> feature2<span style="color: Olive;">]</span><span style="color: Gray;">,</span> dim<span style="color: Gray;">=</span><span style="color: Maroon;">1</span><span style="color: Olive;">)</span><br /> <br /> <span style="color: Green;font-weight:bold;">print</span><span style="color: Olive;">(</span><span style="color: #a11;">"特征1 形状:"</span><span style="color: Gray;">,</span> feature1.<span style="color: #05a;">shape</span><span style="color: Olive;">)</span><br /> <span style="color: Green;font-weight:bold;">print</span><span style="color: Olive;">(</span><span style="color: #a11;">"特征2 形状:"</span><span style="color: Gray;">,</span> feature2.<span style="color: #05a;">shape</span><span style="color: Olive;">)</span><br /> <span style="color: Green;font-weight:bold;">print</span><span style="color: Olive;">(</span><span style="color: #a11;">"拼接后形状:"</span><span style="color: Gray;">,</span> combined.<span style="color: #05a;">shape</span><span style="color: Olive;">)</span><br /> </div> </div> <p>输出结果为:</p> <pre> 特征1 形状: torch.Size([1, 64, 32, 32]) 特征2 形状: torch.Size([1, 128, 32, 32]) 拼接后形状: torch.Size([1, 192, 32, 32])
ニューラルネットワークでは、torch.cat特徴ピラミッド(FPN)などの構造で異なる層の特徴を融合するためによく使用されます。
torch.cat と torch.stack の違い
torch.cat: 既存の次元に沿って連結します。テンソルの形状は連結する次元において加算されます。torch.stack: 新しい次元に沿ってスタックし、新しい次元が追加されます。
サンプル
import torch
a = torch.randn(2, 3)
b = torch.randn(2, 3)
# cat と stack の違い
cat_result = torch.cat([a, b], dim=0)
stack_result = torch.stack([a, b], dim=0)
print("cat の結果の形状:", cat_result.shape) # (4, 3)
print("stack の結果の形状:", stack_result.shape) # (2, 2, 3)
a = torch.randn(2, 3)
b = torch.randn(2, 3)
# cat と stack の違い
cat_result = torch.cat([a, b], dim=0)
stack_result = torch.stack([a, b], dim=0)
print("cat の結果の形状:", cat_result.shape) # (4, 3)
print("stack の結果の形状:", stack_result.shape) # (2, 2, 3)
その他の拡張
Pytorch torch リファレンスマニュアル