AI
[Pytorch] nn.BCELoss(), nn.CrossEntropyLoss()
체봄
2023. 4. 12. 22:44
nn.BCELoss()
label이 0 또는 1인 Binary Classification을 위해서는 nn.BCELoss()를 사용할 수 있다.
이때 주의할 사항은 다음과 같다.
1. input에 sigmoid() 함수를 씌운 후에 loss function에 넣어야한다.
2. input과 target은 동일한 shape이어야 한다.
3. input과 target의 데이터 타입이 모두 Float이어야 한다.
Example:
import torch.nn as nn
loss_func = nn.BCELoss()
sigmoid = nn.Sigmoid()
input = torch.randn(size=(2, 4)) # shape: (2, 4), dtype: float32
target = torch.FloatTensor([[0, 0, 1, 0], [1, 0, 1, 1]]) # shape: (2, 4), dtype: float32
output = loss_func(sigmoid(input), target)
nn.CrossEntropyLoss()
다양한 label이 존재하는 Multi-label Classification을 위해서는 nn.CrossEntropyLoss()를 사용할 수 있다.
PyTorch 공식 문서에 따르면 Input-Target 쌍에서 다양한 shape이 가능하다.
가장 일반적으로는 input의 shape은 (batch_size, label_num), target의 shape은 (batch_size)로 구성하여 사용한다.
주의할 사항은 다음과 같다.
1. nn.BCELoss()에서와는 다르게, target이 input보다 한 차원 작아야 한다.
2. target의 데이터 타입이 Long이어야 한다. (input은 Float)
Example:
import torch.nn as nn
loss_func = nn.CrossEntropyLoss()
input = torch.randn(size=(2, 10)) # shape: (batch_size, label_num), dtype: float32
target = torch.LongTensor([9, 0]) # shape: (batch_size), dtype: int64
output = loss_func(input, target)
반응형