La función torch.nn.functional.softmax toma dos parámetros: input y dim . De acuerdo con su documentación, la operación softmax se aplica a todas las porciones de input a lo largo del dim especificado, y las reescalará para que los elementos se encuentren en el rango (0, 1) y sumen 1.
Deje que la entrada sea:
input = torch.randn((3, 4, 5, 6))Supongamos que quiero lo siguiente, para que cada entrada en esa matriz sea 1:
sum = torch.sum(input, dim = 3) # sum's size is (3, 4, 5, 1)¿Cómo debo aplicar softmax?
softmax(input, dim = 0) # Way Number 0 softmax(input, dim = 1) # Way Number 1 softmax(input, dim = 2) # Way Number 2 softmax(input, dim = 3) # Way Number 3 Mi intuición me dice que es el último, pero no estoy seguro. El inglés no es mi primer idioma y el uso de la palabra along me pareció confuso por eso.
No tengo muy claro qué significa "a lo largo", así que usaré un ejemplo que podría aclarar las cosas. Supongamos que tenemos un tensor de tamaño (s1, s2, s3, s4), y quiero que esto suceda
La respuesta de Steven no es correcta. Vea la instantánea a continuación. En realidad es al revés.
Imagen transcrita como código:
>>> x = torch.tensor([[1,2],[3,4]],dtype=torch.float) >>> F.softmax(x,dim=0) tensor([[0.1192, 0.1192], [0.8808, 0.8808]]) >>> F.softmax(x,dim=1) tensor([[0.2689, 0.7311], [0.2689, 0.7311]])La forma más fácil que se me ocurre para hacerte entender es: digamos que te dan un tensor de forma (s1, s2, s3, s4) y, como mencionaste, quieres que la suma de todas las entradas a lo largo del último eje sea 1.
sum = torch.sum(input, dim = 3) # input is of shape (s1, s2, s3, s4)Entonces deberías llamar al softmax como:
softmax(input, dim = 3) Para entender fácilmente, puede considerar un tensor de forma 4d (s1, s2, s3, s4) como un tensor o matriz de forma 2d (s1*s2*s3, s4) . Ahora, si desea que la matriz contenga valores en cada fila (eje = 0) o columna (eje = 1) que suman 1, simplemente puede llamar a la función softmax en el tensor 2d de la siguiente manera:
softmax(input, dim = 0) # normalizes values along axis 0 softmax(input, dim = 1) # normalizes values along axis 1Puedes ver el ejemplo que Steven mencionó en su respuesta .
Consideremos el ejemplo en dos dimensiones.
x = [[1,2], [3,4]]¿Quieres que tu resultado final sea
y = [[0.27,0.73], [0.27,0.73]]o
y = [[0.12,0.12], [0.88,0.88]]Si es la primera opción, quiere dim = 1. Si es la segunda opción, quiere dim = 0.
Observe que las columnas o la dimensión cero se normalizan en el segundo ejemplo, por lo tanto, se normalizan a lo largo de la dimensión cero.
Actualizado el 10 de julio de 2018: para reflejar que la dimensión cero se refiere a las columnas en pytorch.