Функция torch.cat в PyTorch


Pytorch torch 参考手册Справочное руководство Pytorch torch

torch.catявляется функцией в PyTorch, используемой для конкатенации нескольких тензоров вдоль указанного измерения. Она объединяет несколько тензоров вдоль указанного измерения в один больший тензор.

Это очень распространённая операция в глубоком обучении, например в таких сценариях, как конкатенация карт признаков и объединение пакетов данных.

Определение функции

torch.cat(tensors, dim=0, out=None)

Parameters:

  • tensors(Sequence of Tensor): Последовательность тензоров для конкатенации. Все тензоры должны иметь одинаковую форму во всех измерениях, кроме измерения конкатенации.
  • dim(int, optional): Измерение, по которому выполняется конкатенация. По умолчанию 0.
  • out(Tensor, необязательный): Выходной тензор.

Возвращаемое значение:

  • torch.Tensor: Возвращает конкатенированный тензор.

Примеры использования

Пример 1: Конкатенация по первому измерению

Пример

import torch

# Создайте два тензора
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: Конкатенация по второму измерению

Пример

import torch

# Создайте два тензора
a = torch.randn(2, 3)
b = torch.randn(2, 4)

# Конкатенация по второму измерению (столбцы)
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)

Результат вывода:

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;">&#40;</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;">&#41;</span> &nbsp;<span style="color: #a50"># 来自第一层的特征</span><br />
feature2 <span style="color: Gray;">=</span> torch.<span style="color: #05a;">randn</span><span style="color: Olive;">&#40;</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;">&#41;</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;">&#40;</span><span style="color: Olive;">&#91;</span>feature1<span style="color: Gray;">,</span> feature2<span style="color: Olive;">&#93;</span><span style="color: Gray;">,</span> dim<span style="color: Gray;">=</span><span style="color: Maroon;">1</span><span style="color: Olive;">&#41;</span><br />
<br />
<span style="color: Green;font-weight:bold;">print</span><span style="color: Olive;">&#40;</span><span style="color: #a11;">&quot;特征1 形状:&quot;</span><span style="color: Gray;">,</span> feature1.<span style="color: #05a;">shape</span><span style="color: Olive;">&#41;</span><br />
<span style="color: Green;font-weight:bold;">print</span><span style="color: Olive;">&#40;</span><span style="color: #a11;">&quot;特征2 形状:&quot;</span><span style="color: Gray;">,</span> feature2.<span style="color: #05a;">shape</span><span style="color: Olive;">&#41;</span><br />
<span style="color: Green;font-weight:bold;">print</span><span style="color: Olive;">&#40;</span><span style="color: #a11;">&quot;拼接后形状:&quot;</span><span style="color: Gray;">,</span> combined.<span style="color: #05a;">shape</span><span style="color: Olive;">&#41;</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он обычно используется в структурах, таких как Feature Pyramid Networks (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)

Pytorch torch 参考手册Справочное руководство Pytorch torch

Другие расширения