CE,BCE,BCEwithlogitloss의 차이

김민기·2023년 5월 14일
0
import torch
import torch.nn as nn
import torch.nn.functional as F

#1
torch.nn.functional.cross_entropy(input, target, weight=None, size_average=None,
ignore_index=- 100, reduce=None, reduction='mean', label_smoothing=0.0)

#2
torch.nn.BCELoss(weight=None, size_average=None, reduce=None, reduction='mean')

#3
torch.nn.BCEWithLogitsLoss(weight=None, size_average=None, reduce=None, reduction='mean', pos_weight=None)

첫번째의 CrossEntropyLoss의 경우 클래스의 개수에 맞게 output 차원을 추출한다
ex) class가 4개일경우 출력값은 (batch_size,4)가 되어야한다.

  • Softmax를 모듈 자체에서 지원하기 때문에 출력값을 바로
    loss = F.cross_entropy(logit,label) 를 사용하면된다.

두번째의 BinaryCrossEntropyLoss의 경우 이진분류이기 때문에 softmax가 따로 없으므로
Sigmoid를 통과 시킨 후 비교를해야한다

  • loss = nn.BCELoss(torch.sigmoid(logit),label)
  • Batch_size 가 1인경우 - nn.sigmoid(logit)
  • Batch_size 가 2이상인경우 - torch.sigmoid(logit) 을 사용해야한다.

세번째의 BCEWithLogitLoss의 경우 CrossEntropy에 softmax가 내장되어있는 것 처럼
BCE에 Sigmoid가 추가된 모듈이다

  • 내가 알기로는 (batch_size,1)의 경우
    BCEWithLogitLoss(logit,label) 대신 torch.sigmoid(logit)을 사용해야
    오류가 없었던 것으로 기억한다.
profile
work0ut

0개의 댓글