Функция torch.cat в PyTorch
Справочное руководство 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.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.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)
# Создать несколько тензоров
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он обычно используется в структурах, таких как 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)
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)
Другие расширения