DataScience/DeepLearning

[삽질 기록하기] Keras custom trainer

mkk4726 2024. 2. 26. 19:31

2024.02.25 - [DataScience/Project] - [아이펠톤] DR그알 - DR Segmentation

 

[아이펠톤] DR그알 - DR Segmentation

아이펠에서 아이펠톤이라는 이름으로 프로젝트를 진행했습니다. 여기서 저는 DR그알이라는 팀을 만들고, 팀장 역할을 맡아 프로젝트를 진행했습니다. 사용했던 코드와 최종 발표자료는 https://gi

mkk4726.tistory.com

이 프로젝트를 하면서 시간을 가장 뺏어간 삽질입니다.

 

https://github.com/mkk4726/DR-GeuAl/blob/main/code/assets/one_mask/trainer.py

이런식으로 학습시키는 부분을 직접 짜면서 발생한 문제인데, 결과적으로는 인자를 빼먹어서 생긴 문제입니다.

 


 

1. 문제상황

 

 

이런식으로 2~5 에폭이 넘어가면 아에 학습이 멈춰버리는 문제가 발생했습니다.

모두 이랬으면 문제가 있구나 싶었을 것  같은데, 여러 조건을 실험하던 중에 특정 조건에서는 아래와 같이 학습이 또 잘됩니다.

 

 

그래서 처음에는 조건에 문제가 있다고 판단했습니다.

 

하지만 시간이 지나면서 10개 조건 중 1~2개만 학습이 되니까, 또 성능이 좋지 않으니 뭔가 문제가 있다고 판단했습니다.

그래서 하나씩 따져봤습니다.

 


 

2. 문제 추리기

 

지금은 기억이 잘 안나지만, 조졌다는 생각에 진짜 오만가지 방법을 다 써봤습니다.

 

그 중 가장 유력했던 후보가 기울기가 사라진다는 문제였습니다.

기울기를 뽑아보니 2~5 에폭 이후에는 기울기가 아에 0이 되어버리더라구요.

 

하지만 사용했던 loss 함수는 dice loss, 모델은 unet으로 왠만하면 기울기가 사라질 수 없는 구조라 뭐가 문젠지 모르겠다고만 생각했었습니다.

 

기울기도 바꿔보고, 이것저것 또 삽질했습니다.

 


 

3. 범인 찾음

문제는 생각보다 진짜 간단했습니다.

 

 

이 코드에서 "training=True" 인자를 빼먹어서 그런거였습니다.

 

모델은 결과값을 내놓을 때는 크게 2가지 상황인데, 학습과 추론입니다.

 

따라서 결과값을 받을 때 학습 상황임을 알려줘야하고, 그렇지 않으면 학습이 되지 않는 것입니다.

(간단히 설명하자면)

 

진짜 짠 코드만 몇백줄정도 되는 것 같은데, 그 중 한 줄, 또 그 안에서 인자 하나 빼먹어서 이런 문제가 발생한거라니....

그 순간은 조금 억울했지만, 100% 제 잘못이니 누구를 탓하겠습니까

 

비슷한 문제를 겪는 분들은 시간을 최대한 덜 날리시길...