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

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

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

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

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

해당사진은 nn.CRELoss이며,

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

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

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

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

해당사진은 모델 학습 부분입니다.
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를 구현하는데, 무슨차이가 있어서 학습이 되지 않는지 궁금하여 질문드립니다.

코드가 모두 나와 있는 것은 아니라 제가 예시로 한번 해봤는데 문제는 없어 보입니다.


결과가 동일하게 나오는데요 혹시 다른 부분의 문제가 있는 것은 아닐까요?

좋아요 2

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

좋아요 3

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

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

좋아요 1

답변 감사합니다!