Pytorch BCELoss 와 BCE WithLogitsLoss 의 사용

BCELoss
그림 다 중 탭 을 분류 할 때 3 장의 그림 을 3 가지 로 나 누 면 3*3 의 행렬 을 출력 합 니 다.

먼저 Sigmoid 로 이 값 을 모두 0~1 사이 로 구 합 니 다.

만약 Target 은:


다음은 BCELoss 로 Loss 가 0.7194 인지 확인 해 보 겠 습 니 다!

emmm 는 내 위 에 매번 4 자리 소 수 를 남 겨 두 었 을 것 이다.마지막 까지 계산 하면 오차 가 점점 커지 고 0.0001 차이 가 난다.그래도 대단 합 니 다.하하하하!
BCEWithLogitsLoss
BCE With LogitsLoss 는 Sigmoid-BCE Loss 를 한 단계 합성 하 는 것 이다.우 리 는 방금 input 로 0.7193 인지 아 닌 지 를 직접 검증 합 니 다.

히히,나 정말 대단 해!
보충:Pytorch 에서 BCELoss,BCEWithLogitsLoss 와 CrossEntropyLoss 의 차이
BCEWithLogitsLoss = Sigmoid+BCELoss
네트워크 의 마지막 층 에 N.Sigmoid 를 사용 할 때 BCELoss 를 사용 하고 네트워크 의 마지막 층 에 N.Sigmoid 를 사용 하지 않 을 때 BCE WithLogitsLoss 를 사용 합 니 다.
(BCELoss)BCEWithLogitsLoss
단일 태그 2 분류 또는 다 중 태그 2 분류 에 사용 되 며,출력 과 목표 의 차원 은(batch,C)입 니 다.batch 는 샘플 수량 이 고,C 는 분류 수량 입 니 다.각 batch 의 C 개 값 에 대해 서 는 각각 sigmoid 에서 0-1 사 이 를 구하 기 때문에 각 batch 의 C 개 값 은 관련 이 없고 서로 독립 되 어 있 기 때문에 합 이 꼭 1 이 아 닙 니 다.
모든 C 값 은 같은 종류의 탭 에 속 할 확률 을 나타 낸다.단일 탭 2 분류 라면 출력 과 목표 의 차원 은(batch,1)이면 됩 니 다.
CrossEntropyLoss 는 여러 분류 에 사 용 됩 니 다.
출력 과 목표 의 차원 은(batch,C)입 니 다.batch 는 샘플 수량 입 니 다.C 는 유형 수량 입 니 다.모든 C 는 서로 배척 하고 서로 관련 되 어 있 습 니 다.모든 batch 의 C 개 값 에 대해 모든 C 의 softmax 를 구 합 니 다.그래서 각 batch 의 모든 C 개 값 의 합 은 1 이 고 어느 값 이 큰 지 는 어떤 종류 에 속 하 는 지 대표 합 니 다.2 분류 에 사용 하면 출력 과 목표 의 차원 은(batch,2)입 니 다.
보충:Pytorch 밟 기 구덩이 의 교차 엔트로피(N.CrossEntropy,N.NLLLLoss,N.BCeloss 의 차이 와 사용)
Pytorch 에서 교차 엔트로피 함수 의 혈 루 사 는 N.Cross Entropy Loss()라 는 손실 함수 부터 말 해 야 합 니 다.
표면적 인 의미 에서 볼 때 이 함 수 는 일반적인 교차 엔트로피 함수 인 것 같 지만 Pytorch 의 자 료 를 보면 이 함 수 는 사실 softmax()와 교차 엔트로피 의 결합 체 임 을 알려 줄 것 이다.
그러나 이 함수 의 정 의 를 공식 적 으로 보면 다음 과 같다.

와,N.LogSoftmax()와 N.NLLLLoss()의 결합 체 라 니,이 둘 다 뭐야?다시 보면 N.Softmax()와 N.N.B.CELoss()라 는 손실 도 있 을 것 이다.우 리 는 이 몇 가지 손실 이 도대체 어떤 관계 가 있 는 지 탐구 해 보 자.
N.Softmax 와 N.LogSoftmax
우선 N.Softmax()홈 페이지 의 정 의 는 다음 과 같 습 니 다.

음..우리 가 아 는 그 소프트 맥 스 말 이 야.그 N.LogSoftmax()의 정의 도 매우 직관 적 이다.

아니 나 다 를 까 Softmax 에서 log 를 얻 었 습 니 다.코드 테스트 를 쓸 수 있 습 니 다:

import torch
import torch.nn as nn
 
a = torch.Tensor([1,2,3])
#  Softmax
softmax = nn.Softmax()
sm_a = softmax=nn.Softmax()
print(sm)
#  :tensor([0.0900, 0.2447, 0.6652])
 
#  LogSoftmax
logsoftmax = nn.LogSoftmax()
lsm_a = logsoftmax(a)
print(lsm_a)
#  tensor([-2.4076, -1.4076, -0.4076]),  ln(0.0900)=-2.4076
nn.NLLLoss
위 에서 말 했 듯 이 N.Cross Entropy()는 N.LogSoftmax()와 N.NLLOss 의 결합 이 고 N.NLLOss 홈 페이지 에서 내 린 정 의 는 다음 과 같다.
The negative log likelihood loss. It is useful to train a classification problem with C classes

마이너스 대수 가 손실 되 는 것 같 습 니 다.좀 어 려 운 것 같 습 니 다.코드 를 써 서 테스트 해 보 세 요.

import torch
import torch.nn
 
a = torch.Tensor([[1,2,3]])
nll = nn.NLLLoss()
target1 = torch.Tensor([0]).long()
target2 = torch.Tensor([1]).long()
target3 = torch.Tensor([2]).long()
 
#  
n1 = nll(a,target1)
#  :tensor(-1.)
n2 = nll(a,target2)
#  :tensor(-2.)
n3 = nll(a,target3)
#  :tensor(-3.)
보아하니 N.NLLLLoss 가 하 는 일 은 a 에서 target 위치 에 대응 하 는 값 을 추출 하고 마이너스 번 호 를 취 하 는 것 같다.예 를 들 어 target 1=0 은 a 에서 index=0 위치 에 있 는 값 을 취하 고 마이너스 번 호 를-1 로 취 하 는 것 이다.그러면 이렇게 하 는 것 이 무슨 의미 가 있 을 까?N.Cross Entropy 와 결합 하여 아래 를 내 려 다 봐 야 한다.
nn.CrossEntropy
홈 페이지 에 있 는 N.Cross Entropy()의 표현 식 을 보 세 요:

보아하니 softmax 이후 에 대 수 를 뽑 았 을 것 이다.간단 한 코드 를 써 서 테스트 해 보 자.

import torch
import torch.nn as nn
 
a = torch.Tensor([[1,2,3]])
target = torch.Tensor([2]).long()
logsoftmax = nn.LogSoftmax()
ce = nn.CrossEntropyLoss()
nll = nn.NLLLoss()
 
#  CrossEntropyLoss
cel = ce(a,target)
print(cel)
#  :tensor(0.4076)
 
#  LogSoftmax+NLLLoss
lsm_a = logsoftmax(a)
nll_lsm_a = nll(lsm_a,target)
#  tensor(0.4076)
N.Cross Entropy 와 N.LogSoftmax+N.NLLOss 를 직접 사용 하 는 것 은 같은 결과 인 것 같다.왜 그 러 세 요?교차 엔트로피 표현 식 을 생각해 보 세 요.
l(x,y)=-\sum y*logx=\left\{\begin{matrix} -logx , y=1& \\ 0,y=0& \end{matrix}\right.
그 중에서 y 는 label 이 고 x 는 prediction 의 결과 이기 때문에 교차 엔트로피 손실 은 마이너스 target 대응 위치의 출력 결과 x 재 취-log 이다.이 계산 과정 은 바로 먼저 LogSoftmax()와 NLLLLoss()이다.
------------------------------------
그래서 나 는 N.Cross Entropy Loss 를 사실 softmax loss 라 고 부 르 는 것 이 더 합 리 적 이 라 고 생각한다.그러면 오해 하지 않 을 것 이다.
nn.BCELoss
너 는 이것 이 끝 이 라 고 생각 하 니?사실은 그렇지 않다.또 하나의 손실 은 BCELoss 라 고 합 니 다.다 쓰 면 Binary Cross Entropy Loss 입 니 다.즉,교차 엔트로피 는 2 분류 에 응 용 될 때의 특수 한 형식 입 니 다.보통 sigmoid 와 함께 사용 합 니 다.표현 식 은 2 분류 교차 엔트로피 입 니 다.

직관 적 으로 폴리 페놀 류 와 교차 엔트로피 의 차 이 는y_n=1의 견본 뿐만 아니 라y_n=0의 견본 의 손실 도 고려 한 것 이다.
총결산
N.LogSoftmax 는 softmax 를 바탕 으로 자연 대수 N.NLLLLoss 를 취 하 는 것 은 마이너스 싱크로 율 대수 손실 이지 만 Pytorch 의 실현 은 대응 하 는 target 의 수 를 추출 하고 마이너스 번 호 를 추가 하 는 것 이다.CrossEntropy 에서 LogSoftmax 와 결합 하여 BCELoss 를 2 분류의 교차 엔트로피 손실 로 하고 Pytorch 실현 과 다 분 류 는 차이 가 있다.
Pytorch 는 깊 은 구덩이 입 니 다.사용 매 뉴 얼 을 뿌리 내리 고 실천 과 결합 하여 이 구 덩이 를 밟 아 보 세 요.폭풍 이 울 어 요.
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기