서론

드디어 어제 모델의 코드가 마음에 들게 되었다. 또 기본적인 선형 레이어도 쓸 수 있게 되었다.

Fully-connected (Linear) 레이어 말고도 다른 레이어를 이제 구현해주자.

Conv 정도면 좋을 것 같다.

Convolution - 구현?

Convolution의 개념같은건 충분하게 - 고등학교 비문학 지문부터, 각종 책, 각종 인터넷 웹페이지, 그리고, 그리고…, 그리고 대학 수업에까지 - 배우고도 남았다. 필터가 있고, 이 필터가 합성곱 연산을 수행하는 것이다.

문제는 - 이걸 어떻게 구현할 것인가?

한번도 Convolution을 직접 구현해본 적이 없다.

물론 Convolution의 원리에 따라서 for문 잘 돌리고 하면 되기도 하겠지만… 아닌 것 같다.

Convolution - Layer인가 함수인가?

문제는- Convolution의 구현이 더럽게 복잡하다는거다. 2중 for문을 쓰면 더럽게 느리고 (2중 for라는걸 보면 알겠지만 O(n^2)일께 뻔하다), 좋은 다른 방법을 쓰자니 함수 만들고 뭐하고 하는게 좀 많이 많이 많이 복잡해진다는거다.

한번도 이걸 구현해본 적이 없는건 그만큼 복잡하기 때문이다.

그래도 어떻게든 해보자… 조금 이것 저것 생각할게 있을꺼다.

Convolution 연산을 array_func의 일부로 구현하고, 이를 토대로 Convolution 레이어를 만드는거다.

이거… 오늘 내로 끝내기로 생각했는데 생각보다 더 걸릴 수도 있겠다.

시그니쳐는?

막 엄청 복잡한 Conv를 만들 생각은 없고… 일단은 2D Conv 정도로 만족하자.

아무튼, 시그니처는 어떻게 해야 할까?

PyTorch의 그걸 전부 가져올 생각은 없다. Stride나 Pad같은 것도 (대학교 수준에서 배울 정도로 기초적인 것이지만) 무시할 것이다.

그렇다면 결국 딱 두가지를 받는다. 이미지와 필터. 이름은 x와 kernel 정도로 해주자.

구현은 이런데나 이런데를 참조하자. 둘이 같은 방식이다.

이를 Im2col이라고 부른다.

forward 구현

…될 때까지 어찌 저찌 코드를 굴렸다.

뭔가 뭘 하는지 알고 한다기 보다는 될 때까지 코드를 괴롭힌 그런 기분이다.

아무튼 어떻게든 forward는 되는 모양이다.

다음 시간

backward를 어떻게 구현해야할지 고민해보자. 위 링크를 참조해서 하면 어떻게든 될 것이다.