CLASS torch.nn.Softmax(dim=None)
Applies the Softmax function to an n-dimensional input Tensor rescaling them so that the elements of the n-dimensional output Tensor lie in the range [0,1] and sum to 1.
n차원 Input Tensor에 대해 Softmax function을 적용시킨다.
Output Tensor는 Input Tensor와 같은 shape에 모든 값들은 0~1사이 값이며, (dim에 따라) sum 값이 1이 된다.
참고 : Softmax-PyTorch Documentation
: input = input score
: input의 개수 Index = input score의 개수
왜 이런짓을 하느냐?
우리는 Activation Function을 통해서 Line Equation을 통해 생성된 Score 값을 어떤 확률 로 변환시키고 싶어하였다. (보통 사용되었던 Activation Function은 바로 Sigmoid fucntion! in binary classification)
우리가 계산하고자 하는 Output Classification의 개수 즉, Class의 개수가 여러개 일때 사용하는 것이 바로 Softmax function으로 어떤 Score값 (아무값이나 나올 수 있잖아!)에 대해서 각 Class일 확률을 뽑아낼 수 있다.
Socre 한개에 대해서 Class1일 확률, Class2일 확률, ClassN일 확률이 나온다치면 모두 다 값이 0~1이어야하고 모두 다 더했을 때 당연히 1이 나와야한다.
ex) 고양이일 확률 70%, 강아지일 확률 20%, 코끼리일 확률 10%, 모두 다 더하면 100%
그런데 Score값은 앞서 말했듯이 음수도 나올 수 있으므로...
Natural Exponential Function의 특징
1. 모든 input 에 대해서 output 는 positive(+)
2. 도함수가 같음 즉, (미분이 편함~)
2-1. 따라서 input 가 0일때 output ,
2-2. 따라서 input 가 1일때 output ,
참고 : Natural Exponential Function
Code
import torch
from torch import nn
a = torch.tensor( [1,2,4,3,5,5], dtype=torch.float32)
a = a.view(3,2)
print(a)
print(a.shape)
tensor([[1., 2.],
[4., 3.],
[5., 5.]])
torch.Size([3, 2])
먼저 Row별로 합했을 때 1이 되는 (3,2) size의 Tensor를 생성하자.
softmax = nn.Softmax(dim=0)
softmax_a = softmax(a)
print(softmax_a)
tensor([[0.0132, 0.0420],
[0.2654, 0.1142],
[0.7214, 0.8438]])
그 다음 nn.Softmax()
function을 생성해서 a
input tensor를 넣어주자.
dim=0
이라는 뜻은... Row라는 뜻이고, Row들을 기준으로 Softmax 계산을 해주겠다는 말이다. 이게 좀 헷갈리는데 Row들끼리의~, 행들끼리의~, Row들만의~ 뭐 이런식으로 기억해주자!
softmax_a.sum(dim=0) # Row들 끼리의 합을 구해줘
tensor([1., 1.])
Row들 끼리의 Softmax연산을 했으므로 Row들 끼리의 합이 1임을 볼 수 있다.