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()를 사용할 수 있다.

 

in PyTorch Docs

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)

 

반응형