route 오류는 어떤 순서로 좁혀야 하나요?
먼저 source와 shape 계약을 확인합니다
cfg의 상대 index를 절대 layer index로 바꾼 목록, 각 source의 outputs, out_w, out_h, out_c와 route의 input_sizes를 한 표로 출력합니다. 모든 index가 현재 layer보다 앞인지, sum(input_sizes)==l.outputs인지, channel concat이면 공간 크기가 같은지 확인합니다. 이 단계에서 실패하면 tensor 값보다 parser와 shape 전파를 먼저 고칩니다.
다음으로 batch별 값과 gradient를 비교합니다
source마다 10, 20처럼 서로 다른 시작값을 넣고 batch마다 100을 더한 패턴을 사용하면 source-major와 batch-major 혼동을 쉽게 찾을 수 있습니다. forward 결과의 각 sample이 source 순서를 유지하는지, backward에서는 같은 offset 조각이 원본 batch stride에 더해지는지 봅니다. source delta를 0이 아닌 초기값으로 두면 덮어쓰기와 누적도 구분됩니다.
마지막으로 resize와 전체 graph를 시험합니다
입력 feature 크기를 바꾼 뒤 input_sizes, outputs와 buffer가 함께 바뀌는지 확인하고, 외부가 보관한 오래된 output, delta 포인터가 없는지 검사합니다. 같은 source가 route와 다른 branch에 연결된 graph에서 finite difference를 수행하면 gradient 합과 네트워크의 delta 초기화 순서를 함께 검증할 수 있습니다.
이 글은 제시된 Darknet Route Layer의 copy_cpu, axpy_cpu와 shape 전파 코드를 해설합니다. 다른 fork가 group route, channel slice나 별도 resize 옵션을 추가했을 수 있으므로 포팅 대상 커밋의 parser와 layer 구조체를 다시 확인해야 합니다. 함수 이름이 route라는 이유만으로 여기의 단순 concat 계약을 모든 버전에 적용하지 않습니다.