Pytorch_Softmax_classification

Pytorch Softmax Classificaton 을 통한 N개의 이벤트 분류하기

모두를 위한 딥러닝 - 파이토치 강의 참고

  • binary classificaton 문제를 해결할 때 sigmoid함수를 사용했습니다.

  • 정확히는 F.binary_cross_entropy 안에 sigmoid함수가 같이 녹아있는 형태로 loss함수를 사용했습니다.

  • 하지만, 세개 이상의 분류문제를 해결하기 위해서는 sigmoid함수가 아닌 softmax함수를 사용해야 합니다.

  • softmax함수는 아래와 같은 식으로 나타낼 수 있습니다.

  • softmax

  • K개의 입력값을 0~1 사이의 값이 되도록 K개의 SUM으로 나눠주게 됩니다. 따라서 모든 확률의 합은 1이됩니다. 또한 입력값의 순서가 출력값의 순서와 같음을 확인할 수 있습니다.

  • 이제 Pytorch를 통해 SoftmaxClassifierModel을 정의해 보았습니다.

1
2
3
4
5
6
7
8
9
10
# 모델 정의
class SoftmaxClassifierModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(16, 7)

def forward(self, x):
return self.linear(x)

model = SoftmaxClassifierModel()
  • 모델을 정의한 내용을 보면 입력값X에 따른 Linear함수만을 통과하고 Softmax함수를 통과하지 않는것을 볼 수 있습니다.

  • 이는 loss함수에서 사용하게 될 F.cross_entropy에 Softmax함수가 포함되어 있기 때문입니다.

  • 따라서 정의한 모델에서는 Softmax를 통과하기전의 Linear함수를 통과한 output값을 되돌려줘야 합니다.

  • optimizer를 정의하고,

1
2
# optimizer 정의
optimizer = optim.SGD(model.parameters(), lr=0.1)
  • 정한 epoch수 만큼 학습하며 loss를 출력해봅니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
epochs = 1000
# 학습
for epoch in range(epochs + 1):

predict = model(x_train)
loss = F.cross_entropy(predict, y_train)

optimizer.zero_grad()
loss.backward()
optimizer.step()

if epoch % 100 == 0:
print('Epoch {:4d}/{} loss : {:.6f}'.format(
epoch, epochs, loss.item()
))

###>>>print
Epoch 0/1000 loss : 1.721660
Epoch 100/1000 loss : 0.462462
.
.
.
Epoch 900/1000 loss : 0.110220
Epoch 1000/1000 loss : 0.100880
  • 출력된 loss를 통해 모델이 정상적으로 학습되는것을 확인할 수 있습니다. 이처럼 N개의 이벤트를 분류할 경우는 Softmax함수를 두개의 이벤트를 분류할 경우는 Sigmoid함수를 사용한다는것을 배울 수 있었습니다.

Full Code

Full Code

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×