[Conceptos básicos de Python para verificar y llenar espacios] Operaciones de dimensión de arreglos o matrices de uso común (corte, compresión, expansión, transposición, disposición, aplanamiento)

1 operación de corte

forma general:

x[:, :, :, :]

Esta operación es la más básica y la más difícil de entender para los principiantes. Ya sea en la matriz np.array o en torch.tensor, podemos usar este método general para dividir la matriz que necesitamos.
Operación de corte simple:

x[idx_start:idx_end:stride]  #x[起点:终点:步长]

Cortar con comas:

x[idx_start:idx_end, idx_start:idx_end:stride]

La función de la coma es distinguir la dimensión (recuerda esto, básicamente puedes entender este tipo de gramática) , si el tamaño del paso es -1, significa llevarlo de atrás hacia adelante, pero cabe señalar que el tamaño del paso delante de la coma no se puede limitar. Además, agregue un sentido común: cuando encuentre este tipo de sintaxis [m:n], tenga en cuenta que la izquierda está cerrada y la derecha está abierta, es decir, m se puede obtener en el lado izquierdo, pero n no puede ser obtenido en el lado derecho, y solo se puede obtener n-1 (rango asociado (0, n) Esta sintaxis es la misma, el rango de valores es 0 ~ n-1).
Ejemplo:
tome las dimensiones 5-7 de la tercera dimensión y tome las dimensiones 0, 1 de la cuarta dimensión

x = torch.zeros(8, 1, 16, 3)
y = x[:, :, 5:8, :-1]
print(y.shape)
torch.Size([8, 1, 3, 2])

¡Cuidado con el problema del corte en serie!
Aún con el ejemplo anterior, tome las dimensiones 5-7 de la tercera dimensión y las dimensiones 0, 1 de la cuarta dimensión, si escribe de acuerdo con el método de valor matricial (use varios corchetes para ubicar cada dimensión por separado) Será algo como esto:

x = torch.zeros(8, 1, 16, 3)
y = x[:][:][5:8][:-1]
print(y.shape)
torch.Size([2, 1, 16, 3])

¡Este resultado es obviamente incorrecto! Debido a que el 8 en la primera dimensión se corta en 2, nada más cambia.
Entonces, para comprender el concepto de cortes continuos aquí, depuramos y analizamos el código anterior:

  • El resultado de x[:] es: torch.Size([8, 1, 16, 3]), obviamente sin cambios
  • El resultado de x[:][:] es: torch.Size([8, 1, 16, 3]), aún sin cambios
  • El resultado de x[:][:][5:8] es: torch.Size([3, 1, 16, 3]), la primera dimensión 8->3
  • El resultado de x[:][:][5:8][:-1] es: torch.Size([2, 1, 16, 3]), la primera dimensión 3->2

Se puede observar que este método de rebanado continuo (entendido como múltiples corchetes consecutivos) no cambia cada dimensión por separado , sino que debe realizar un nuevo rebanado sobre el resultado del paso de rebanado anterior, y x[3][ 1][2 ][4] ¡La idea del valor de la matriz es completamente diferente!
Si desea lograr cortes separados para cada dimensión, debe usar el método de escritura en el ejemplo anterior:

x[:, :, 5:8, :-1]

Arriba solo mencioné usos comunes y errores. Para obtener tutoriales y ejemplos detallados, consulte:

2 Operaciones de compresión y expansión

forma general:

x.squeeze(dim=n)
x.unsqueeze(dim=n)

Muchas veces, necesitamos realizar operaciones con matrices después de expandir o comprimir las dimensiones de la matriz. La función squeeze() es una operación de compresión, que elimina una dimensión con un valor de 1, o elimina varias dimensiones con un valor de 1; la función unsqueeze() es una operación de expansión, que agrega una dimensión a una determinada dimensión Una dimensión con un valor de 1.
Ejemplo:
añadir una dimensión 1 entre las dimensiones correspondientes de 256 y 32

x = torch.zeros(8, 256, 32, 64)
y = x.unsqueeze(dim=2)
print(y.shape)
torch.Size([8, 256, 1, 32, 64])

Eliminar la dimensión anterior 1

x = torch.zeros(8, 1, 256, 1)
y = x.squeeze(dim=1)
print(y.shape)
torch.Size([8, 256, 1])

eliminar simultáneamente varias (todas) dimensiones1

x = torch.zeros(8, 1, 256, 1)
y = x.squeeze()  # 留空就是删掉所有维度1
print(y.shape)
torch.Size([8, 256])

3 Operaciones de transposición

forma general:

x.transpose(m, n)

transpose() significa transposición, es decir, se intercambian dos posiciones en álgebra lineal, y lo mismo es cierto en matrices de alta dimensión.
Ejemplo:
Intercambiar las dimensiones correspondientes de 256 y 32

x = torch.zeros(8, 256, 32, 64)
y = x.transpose(1, 2)
print(y.shape)
torch.Size([8, 32, 256, 64])

4 Organizar operaciones

forma general:

x.permute(c, b, a, d)

La función permute() es una forma más general de transpose() porque puede manejar transformaciones secuenciales en múltiples posiciones al mismo tiempo. Esta operación es muy fácil de entender, si la matriz original es (8, 256, 32, 64), entonces la posición 0 corresponde a 8, la posición 1 corresponde a 256, la posición 2 corresponde a 32 y la posición 3 la posición corresponde a 32. Si queremos que la matriz se convierta en (256, 8, 32, 64), entonces debe intercambiar las posiciones 0 y 1, por lo que la sintaxis es la siguiente:

x.permute(1, 0, 2, 3)

Ejemplo:
8 corresponde a la dimensión que no se mueve, 256 corresponde a la dimensión para moverse al final, 32 corresponde a la dimensión para moverse a la segunda posición y 64 corresponde a la dimensión para moverse a la penúltima posición

x = torch.zeros(8, 256, 32, 64)
y = x.permute(0, 2, 3, 1)
print(y.shape)
torch.Size([8, 32, 64, 256])

No cambie la posición de cada dimensión.

x = torch.zeros(8, 256, 32, 64)
y = x.permute(0, 1, 2, 3)  # 注意:这个就是表示原位置
print(y.shape)
torch.Size([8, 256, 32, 64])

5 Operación de aplanado

forma general:

x.flattten(m, n)

En la construcción de redes neuronales, algunas dos dimensiones de la matriz a menudo se fusionan (como H x W) antes de la conexión completa. Esta operación se denomina aplanamiento. Tenga en cuenta que los dos índices de posición en la función flatten() requieren m<n, de lo contrario, se informará un error.
Ejemplo:
aplanar las dos últimas dimensiones

x = torch.zeros(8, 1, 16, 3)
y = x.flatten(-2, -1)
print(y.shape)
torch.Size([8, 1, 48])

Supongo que te gusta

Origin blog.csdn.net/qq_16763983/article/details/126551115
Recomendado
Clasificación