Función PyTorch torch.cat


Pytorch torch 参考手册Manual de referencia de Pytorch torch

torch.catEs una función en PyTorch que se utiliza para concatenar múltiples tensores a lo largo de una dimensión especificada. Une múltiples tensores a lo largo de la dimensión especificada en un tensor más grande.

Esta es una operación muy común en el aprendizaje profundo, por ejemplo, en escenarios como la concatenación de mapas de características o la unión de lotes de datos.

Definición de la función

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

Parámetros:

  • tensors(Sequence of Tensor): la secuencia de tensores a concatenar. Todos los tensores deben tener la misma forma en todas las dimensiones excepto en la dimensión de concatenación.
  • dim(int, opcional): la dimensión de concatenación, por defecto es 0.
  • out(Tensor, opcional): el tensor de salida.

Valor de retorno:

  • torch.Tensor: Devuelve el tensor concatenado.

Ejemplos de uso

Ejemplo 1: Concatenar a lo largo de la primera dimensión

Ejemplo

import torch

# Crear dos tensores
a = torch.randn(2, 3)
b = torch.randn(2, 3)

# Concatenar a lo largo de la primera dimensión (filas)
c = torch.cat([a, b], dim=0)

print("La forma de a:", a.shape)
print("La forma de b:", b.shape)
print("La forma de c:", c.shape)
print(c)

El resultado de salida es:

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]])

Ejemplo 2: Concatenar a lo largo de la segunda dimensión

Ejemplo

import torch

# Crear dos tensores
a = torch.randn(2, 3)
b = torch.randn(2, 4)

# Concatenar a lo largo de la segunda dimensión (columnas)
c = torch.cat([a, b], dim=1)

print("La forma de a:", a.shape)
print("La forma de b:", b.shape)
print("La forma de c:", c.shape)

El resultado de salida es:

a 的形状: torch.Size([2, 3])
b 的形状: torch.Size([2, 4])
c 的形状: torch.Size([2, 7])

Ejemplo 3: Concatenar varios tensores

Ejemplo

import torch

# Crear varios tensores
a = torch.tensor([1, 2])
b = torch.tensor([3, 4])
c = torch.tensor([5, 6])

# Concatenar varios tensores
result = torch.cat([a, b, c])

print(result)

El resultado de salida es:

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])

En las redes neuronales,torch.catse usa comúnmente en estructuras como la pirámide de características (FPN) para fusionar las características de diferentes capas.


Diferencia entre torch.cat y torch.stack

  • torch.cat: Se concatenan a lo largo de una dimensión existente, y las formas de los tensores se suman en la dimensión de concatenación.
  • torch.stack: Se apilan a lo largo de una nueva dimensión, lo que añade una nueva dimensión.

Ejemplo

import torch

a = torch.randn(2, 3)
b = torch.randn(2, 3)

# Diferencia entre cat y stack
cat_result = torch.cat([a, b], dim=0)
stack_result = torch.stack([a, b], dim=0)

print("Forma del resultado de cat:", cat_result.shape)  # (4, 3)
print("Forma del resultado de stack:", stack_result.shape)  # (2, 2, 3)

Pytorch torch 参考手册Manual de referencia de Pytorch torch

Otras extensiones