Mi informacion de contacto
Correo[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
import torch
x = torch.arange(16).reshape(1,4,4)
print(x)
print('--------')
a = x.sum(axis = 1,keepdim=True)
a2 = x.sum(axis = 1,keepdim=False)
a3 = x.sum(axis = 0,keepdim=True)
a4 = x.sum(axis = 0,keepdim=False)
a5 = x.sum(axis = 2,keepdim=True)
print(a)
print(a2)
print('----------')
print(a3)
print(a4)
print(a5)
import torch
x = torch.arange(16).reshape(4,4)
print(x)
print('--------')
a = x.sum(axis = 1,keepdim=True)
a2 = x.sum(axis = 1,keepdim=False)
print(a)
print(a2)
print(x/a)
Combine estos dos ejemplos para explicar en detalle los cambios en el eje en diferentes circunstancias.
Comprender las operaciones dimensionales en tensores y la suma a lo largo de ejes específicos en PyTorch lleva un poco de tiempo. Analicemos estas operaciones paso a paso a través de dos ejemplos, explicando en detalle los cambios de eje en diferentes situaciones.
import torch
x = torch.arange(16).reshape(1, 4, 4)
print(x)
print('--------')
a = x.sum(axis=1, keepdim=True)
a2 = x.sum(axis=1, keepdim=False)
a3 = x.sum(axis=0, keepdim=True)
a4 = x.sum(axis=0, keepdim=False)
a5 = x.sum(axis=2, keepdim=True)
print(a)
print(a2)
print('----------')
print(a3)
print(a4)
print(a5)
tensor([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
Esta es una forma de (1, 4, 4)
de tensores. Podemos considerarlo como un lote que contiene una matriz de 4x4.
x.sum(axis=1, keepdim=True)
Suma a lo largo del eje 1 (es decir, la dirección de la segunda dimensión, 4), manteniendo las dimensiones.
tensor([[[24, 28, 32, 36]]])
La forma se vuelve (1, 1, 4)
。
x.sum(axis=1, keepdim=False)
Suma a lo largo del eje 1, no se conserva ninguna dimensionalidad.
tensor([[24, 28, 32, 36]])
La forma se vuelve (1, 4)
。
x.sum(axis=0, keepdim=True)
Suma a lo largo del eje 0 (es decir, la dirección de la primera dimensión, 1), manteniendo las dimensiones.
tensor([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
Debido a que el tensor original tiene solo un elemento en el eje 0, el resultado es el mismo que el tensor original, con forma (1, 4, 4)
。
x.sum(axis=0, keepdim=False)
Suma a lo largo del eje 0, la dimensionalidad no se conserva.
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
La forma se vuelve (4, 4)
。
x.sum(axis=2, keepdim=True)
Suma a lo largo del eje 2 (es decir, la tercera dimensión, la dirección de 4), manteniendo las dimensiones.
tensor([[[ 6],
[22],
[38],
[54]]])
La forma se vuelve (1, 4, 1)
。
keepdim=True
Las dimensiones sumadas se mantendrán, el número de dimensiones del resultado permanece sin cambios, pero el tamaño de las dimensiones sumadas pasa a ser 1.keepdim=False
Las dimensiones sumadas se eliminarán y el número de dimensiones en el resultado se reducirá en 1.import torch
x = torch.arange(16).reshape(4, 4)
print(x)
print('--------')
a = x.sum(axis=1, keepdim=True)
a2 = x.sum(axis=1, keepdim=False)
print(a)
print(a2)
print(x/a)
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
Esta es una forma de (4, 4)
de tensores.
x.sum(axis=1, keepdim=True)
Suma a lo largo del eje 1 (es decir, la dirección de la segunda dimensión, 4), manteniendo las dimensiones.
tensor([[ 6],
[22],
[38],
[54]])
La forma se vuelve (4, 1)
。
x.sum(axis=1, keepdim=False)
Suma a lo largo del eje 1, no se conserva ninguna dimensionalidad.
tensor([ 6, 22, 38, 54])
La forma se vuelve (4,)
。
x / a
tensor([[0.0000, 0.1667, 0.3333, 0.5000],
[0.1818, 0.2273, 0.2727, 0.3182],
[0.2105, 0.2368, 0.2632, 0.2895],
[0.2222, 0.2407, 0.2593, 0.2778]])
Esta es la suma de cada elemento dividida por su fila correspondiente, dando como resultado:
tensor([[ 0/6, 1/6, 2/6, 3/6],
[ 4/22, 5/22, 6/22, 7/22],
[ 8/38, 9/38, 10/38, 11/38],
[12/54, 13/54, 14/54, 15/54]])
usar keepdim=True
Al mantener las dimensiones, la dimensión sumada pasa a ser 1.usarkeepdim=False
Cuando , se eliminan las dimensiones sumadas.
¿Por qué las filas se convierten en columnas en lugar de remodelar (1, 4, 4)? ¿Solo cuando remodelar (4, 4) las filas aparecen como filas?
Repasemos primero los conceptos básicos:
(4, 4)
import torch
x = torch.arange(16).reshape(4, 4)
print(x)
Producción:
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
La forma de este tensor es (4, 4)
, representa una matriz de 4x4:
DE ACUERDOes horizontal:
[ 0, 1, 2, 3]
[ 4, 5, 6, 7]
[ 8, 9, 10, 11]
[12, 13, 14, 15]
Listaes vertical:
[ 0, 4, 8, 12]
[ 1, 5, 9, 13]
[ 2, 6, 10, 14]
[ 3, 7, 11, 15]
(1, 4, 4)
x = torch.arange(16).reshape(1, 4, 4)
print(x)
Producción:
tensor([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
La forma de este tensor es (1, 4, 4)
, representa un tensor tridimensional de 1x4x4:
1
, indicando el tamaño del lote.4
, representa el número de filas (filas por matriz).4
, representa el número de columnas (columnas de cada matriz).(4, 4)
:a = x.sum(axis=1, keepdim=True)
print(a)
Producción:
tensor([[ 6],
[22],
[38],
[54]])
(1, 4, 4)
:a = x.sum(axis=1, keepdim=True)
print(a)
Producción:
tensor([[[24, 28, 32, 36]]])
existir (1, 4, 4)
En el tensor tridimensional, la primera dimensión representa el tamaño del lote, por lo que parece que cada matriz 4x4 todavía se procesa de manera bidimensional cuando está en funcionamiento. Sin embargo, debido a que se agrega una dimensión por lotes, se comporta de manera diferente a un tensor bidimensional en la operación de suma.
Específicamente: