강의를 들은 건 없고 하루 종일 선택과제만 풀었던 하루였다.
CNN visualization에 대한 실습이었다.
강의 때 배운 방법들로 지난 P-stage 대회 때 사용한 dataset에 대해 visualization을 해봤으며, grad-CAM도 다뤘다.
img의 차원 관리가 어렵다.(어설프게 짜맞추기는 했지만, 각 차원이 나타내는 의미를 매번 이해하고 변경하진 못한 것 같다.)
중간에 hook을 통해 intermediate layer의 gradient를 가져와야 했는데, 이 부분에서 단순히 layer에 register_backward_hook을 등록하면 grad가 저장되지 않아서 굉장히 오래 헤맸다.
register_backward_hook(hook)
은 register_full_backward_hook(hook)
과 같은 동작을 하며, 이 때 hook은 반드시 parameter로 hook(module, grad_input, grad_output)
의 형태를 지녀야 한다. 이와 별개로 특정 layer에만 hook을 주고 싶을 땐 register_hook(hook)
을 사용해야 하며, 여기에 들어가는 hook은 parameter로 hook(grad)
를 받으면 된다. grad CAM을 구현하기 위해선 fc layer output의 visualizing 하고 싶은 layer에 대한 gradient를 구해야 하므로 register_hook()
을 사용하는 게 맞으며, 과제 코드에서 hook function의 parameter가 grad로 되어 있었으므로 의심의 여지 없이 register_hook()
을 사용하여야 했다.어쨌든 과제는 했지만 그 내용에 대한 이해가 부족한 것 같아, 나중에 솔루션을 참고해 분석해 봐야겠다.
오늘도 갈 길은 멀다고 느꼈다.. 해야 할 게 많고 대충 어떤 식으로 하면 좋을 것 같다 생각은 드는데 실행에 옮기긴 좀 힘든 느낌이다. 일단 당장 배우는 것부터 잘 하자(항상 말하는 것 같다.)
확실히 관련 기술이 급속도로 성장하고 바뀐다는 것을 강의를 통해 느꼈다. segmentation이나 detection 부분도 나름 최신의 것으로 여겨졌는데, 2018년 이후로는 논문이 별로 안 나오고 대부분 Instance segmentation 같은 쪽으로 넘어갔다는 걸 들으니, 모든 걸 다 이해하긴 힘들겠다 싶으면서도 어떻게든 따라잡고 싶다는 생각도 들고 그랬다. 이래서 기술을 빠르게 이해하고 사용하는 능력이 중요한 것 같다.