Función PyTorch torch.cat
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)
# 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)
# 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)
# 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;">(</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])
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)
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)
Otras extensiones