본문 바로가기
인공지능

7.4.3 합성곱 계층 구현하기

by Falto 2021. 8. 4.

이제 본격적으로 코딩해 가면서 공부해 보기.
먼저 im2col 함수가 어떻게 동작하는 지 알아봄.
어떤 함수이든지 실제로 이것저것 대입해보며 동작하는 실제 모습을 봐야 내 것이 됨.
im2col 함수에 대해 이렇게 되어 있음 (*im2col 함수 실제 내부 코드 보면 몇 줄 안됨)

꼭 기억해야 할 점은
(1) 입력데이타는 4차원이어야 한다는 거, 반드시!!!!
(2) 필터 높이, 필터 너비 등 필터 관련 정보를 인수로 넣게 되어 있는데 im2col 함수는 필터와 전혀 관계가 없음. 
여기서 말하는 필터는 im2col 함수가 2차원 배열을 출력했을 때, 그 배열에 가해지는 필터에 대한 정보임.
즉, 나중에 할 필터 연산에 맞춰서 2차원 배열을 im2col이 출력하도록 위한 정보를 미리 im2col 인수에 넣는다는 것임.

일단 im2col의 동작을 살펴보기 위해서 필터를 최대한 간단한 놈(1x1)으로 해봤음. 
입력데이타는 (1,1,3,3)로 해서 최대한 간단하게 했음.

실행 결과는 다음과 같음.

3x3 행렬을 넣었더니, 결과는 9x1 행렬이 되어 나왔음. 한 줄이네 ~~~ 9x2로 되게 하려면????

3x3이 두개 겹친 걸 입력데이타로 넣었더니, 3x3이 펼쳐진 9x1이 두개로 되었음, 즉 9x2가 되었음.
각 3x3은 출력에서 볼 때, 하나의 열임.
이상은 필터가 1x1 모양일 때인데, 만약 필터 모양을 바꾸면 어떻게 될까?

문제를 간단하게 하기 위해 행렬을 다시 쉬운걸로 원복. 필터를 2x1로 했을 때,

아래는 필터 크기를 1x2로 했을 때, 

 

일단, 출력 크기는 똑같다. 6x2이다. 이번에는 필터 크기를 2x2로 했을 때,

 

이상 결과를 보면 im2col은 아래와 같은 동작을 하는 듯함.
만약 4x4 입력에 3x2 필터를 적용시키면 아래와 같이 될 것임.

진짜 그런가? 실제로 해보니까....

예측한 대로였음. 
이상 im2col에 대한 이해 끝!

즉, 입력데이타 안에서 돌아댕기는 필터 수가 행의 수가 되고,
필터를 쳤을 때 필터 안에 있는 원소 수가 열의 수가 되는 것임. 출력 결과는 그렇게 나옴.

만약 입력데이타가 N개이면 출력데이타의 크기는 어떻게 변할까? 이것도 직접 해보면 됨.
N=2로 해서 다음과 같이 코드짜서 돌려봄.

결과를 보니까 입력데이타 행렬이 1개일 때와 2개일 때 차이는 '행' 수에 변화가 있음 N=2로 했더니, 1일때 대비해서 2배가 됨. 따라서 입력데이타 행렬이 10개이면 10x 가 됨. 열갯수는 불변

그래서 어쨌든, 콘볼루션 계층을 파이썬으로 구현하면 아래와 같다.

CNN 네트워크에서 아래 빨간색 동그라미 부분이 해결되었음.

다음엔 Pooling 을 구현하면 끄읕.
ReLU Affine, Softmax는 앞에서 구현되었으니까.

댓글