'사과'와 '멜론' 2개의 클래스가 존재하는 이미지의 학습을 수행하던 도중, 이런 에러가 떴다.
대충 해석해보면 convolutional layer의 필터 개수가 class의 숫자와 상응하지 않는다는 것.
모델을 구성해주는 config 파일을 다시 들여다 봤다.
여기가 바로 문제가 된 지점. YOLO 직전의 convolutional layer의 필터 초기값이 255로 설정되어 있다.
필터의 숫자와 클래스의 숫자는 다음과 같은 관계를 가진다.
필터 수 = (클래스 수 + 5) * mask 길이
즉, 지금처럼 클래스가 2개이고 마스크가 3개인 경우, 요구되는 필터의 수는:
(2 + 5) * 3 = 21
이에 filter 값을 21로 수정해주니 모델이 성공적으로 돌아간다.
Convolutional 레이어에서 필터의 숫자는 해당 레이어가 탐지해야 할 특징의 수를 결정한다. 특히 YOLO 모델에서는 마지막 convolutional 레이어의 필터 수가 바운딩 박스와 클래스 예측에 필요한 정보를 인코딩하는 데 사용된다.
이렇게 하나의 bounding box 안에서 5개의 기본 필터와 함께 2개 클래스를 위한 필터가 사용되는 셈이다. 이런 bounding box가 3개(masks) 있으니 총 21개의 필터가 필요한 것이다.
이런 작은 시행착오들이 문제의 원리를 이해해볼 기회가 될 때면 디버깅하느라 보낸 시간이 조금은 뿌듯하게 느껴지곤 한다.