생성 코드에서 초기화 범위를 확인해야 하는 이유
weight 배열은 모든 위치를 포함해 할당하지만, 제시된 초기화 loop의 범위에는 locations가 없다.
1
2
3
4
| float scale = sqrt(2./(size*size*c));
for(i = 0; i < c*n*size*size; ++i){
l.weights[i] = scale*rand_uniform(-1, 1);
}
|
calloc으로 만든 나머지 위치의 weight는 0인 채 남는다. forward_local_layer는 위치 j마다 서로 다른 block을 읽으므로, 이 코드 그대로라면 첫 위치 block만 난수 초기화되고 뒤 위치들은 0에서 시작한다. 의도된 초기화인지 확인하려면 loop 상한이 할당 크기와 같은지 대조해야 한다.
추가로 layer를 구성할 때 다음을 검사하면 shape 오류를 빨리 찾을 수 있다.
out_h, out_w가 양수이며 기대한 pad 규칙과 맞는가?- network workspace가
out_h*out_w*size*size*c 원소를 담는가? - weight와 weight update가
locations까지 포함해 할당, 초기화됐는가? - bias 길이가
n이 아니라 locations*n이라는 점을 반영했는가? - forward와 backward에서 같은 위치별 offset을 사용하는가?
Local Layer를 이해하는 가장 빠른 방법은 convolution이라는 이름과 비교하는 것이 아니라, j가 변할 때 a 포인터가 이동하는지 보는 것이다. 위치마다 weight 주소가 달라진다는 한 줄이 파라미터 수, 연산 구조, 초기화 범위까지 모두 결정한다.