pytorch의 CrossEntropyLoss 를 구현한 custom Loss에 관하여 질문드립니다.

파이토치에 관해 관심이 생겨 공부를 하는 중, nn.CrossEntropyLoss()를 구현하려고 합니다.

그러나 학습이 custom loss를 사용하였을때 진행되지 않아 질문드립니다.

dataset은 kaggle cat dog dataset 이고,
개발환경은 vscode jupyter,
GPU는 GTX1050 ti 입니다.

cross entropy 구현에 참고한 링크는
CrossEntropyLoss — PyTorch 1.12 documentation 이며,

해당사진은 nn.CRELoss이며,
image

해당 사진은 제가 구현한 loss입니다.
image

예제의 값은 똑같이 나온다고 생각하여, loss를 대체하여 학습을 진행하였습니다.

해당사진은 model 학습에 사용된 custom loss function입니다.
image

해당사진은 dataset 구축 부분입니다.
image

해당사진은 모델 학습 부분입니다.
image

특이사항으로는 제가 구현한 loss에서는 target이 one hot encoding을 하고 넘겨져야 합니다.
custom loss의 backward를 실행하기 위해선 requires_grad 가 True 가 되야 한다고 해서 추가했습니다.

결과는
custom loss 를 사용하였을경우
loss가 0.42515 … 의 값에서
아주 조금씩 감소 하거나 값이 그대로 유지됩니다.

nn.cross entropy를 사용하였을 경우는
아래와 같습니다.
image
또한 정상적으로 학습이 진행되는것 같습니다.

일반적인 프로젝트였다면, nn.crossEntropyLoss를 사용했을테지만,
제가 관심있는 논문이 custom loss를 사용한 부분이 있어,
custom loss의 구현에 대해 어느정도 숙지를 해야 된다고 생각합니다.
개인 학습을 위해서 custom loss를 구현하는데, 무슨차이가 있어서 학습이 되지 않는지 궁금하여 질문드립니다.

1개의 좋아요

코드가 모두 나와 있는 것은 아니라 제가 예시로 한번 해봤는데 문제는 없어 보입니다.
image
결과가 동일하게 나오는데요 혹시 다른 부분의 문제가 있는 것은 아닐까요?

2개의 좋아요

답변감사드립니다.
말씀 듣고 혹시 torch 문서에서 놓친게 있나 찾아봤는데,
loss function의 reduction이 mean인걸 놓쳤습니다.
image
그래서 이 부분 수정해주니 해결되었습니다
image

3개의 좋아요

대단하시네요
이렇게 직접 구현해야 할 일이 자주 있나요?

저는 아직 학부생이라 이 질문의 대한 대답은 필드에서 종사하시는 다른분들이 좀더 정확히 아실거라 생각합니다. 제가 개인 학습을 하며 느낀 바로는, 대부분의 경우/유명한 논문의 경우엔 이미 구현이 잘 되어있었다는 점이었습니다.
그러나 그 외의 경우엔 수식만 공개된 경우가 많은것 같습니다.

1개의 좋아요

답변 감사합니다!