본문 바로가기
파이썬 프로그래밍/Numpy 딥러닝

35. [CNN기초] 원, 네모를 구별하는 CNN 만들기(이론)

by Majestyblue 2023. 1. 28.

1. 문제제기

아래 예시와 같이 원과 네모를 구별하는 문제가 있다. 3살짜리 아이도 맞출 만큼 굉장히 쉬운 문제다.

https://www.liveworksheets.com/worksheets/en/Math/Shapes/Circle_and_Square_ku1602152hi

 

 

 

 

 

실전을 들어가 보자.

3 × 3 크기의 합성곱 필터 1개를 이용하여 합성곱 → relu → 2 × 2 필터 Max pooling → 분류기 fc → sigmoid를 이용하여 원과 네모를 분류할 수 있을까?

 

 

 

 

데이터를 구해보자. 본인은 데이터를 구할 때 kaggle을 열심히 이용한다.

아래와 같이 용량도 적절한 데이터를 찾았다. CC0:Public Domain 라이센스도 맘에 든다.

149.2kB인 착한 용량도 마음에 든다.

https://www.kaggle.com/datasets/cactus3/basicshapes

 

 

이 데이터는 원(Circle) 100장, 네모(Square) 100장, 삼각형(Triangle) 100장으로 구성된 28 × 28 데이터인데, 필터 1개만 이용할 것이므로 단순화하여 원과 네모로만 구성해 보겠다.

 

 

 

 

2. 순전파 구현하기

아래와 같이 순전파를 구현할 것이다.

정리하자면 Input → Conv2D → relu → Max pooling → Flatten → fc → sigmoid 로 구성되어 있다.

가중치는 합성곱 W = (3, 3), B = (1, 1) 이고 선형 연산 W = (1, 196), B = (1, 1)로 선언하였으며

이진 교차 엔트로피 오차(BCE)를 이용한다.

 

 

 

 

 

각 과정에서 어떤 일이 일어나는지 자세히 알아보자.

이미지의 shape이 어떻게 변하는지 잘 봐야 한다. 왜냐하면 역전파 과정에서 이미지 shape 과정이 반대로 일어나기 때문이다!!! 정말정말 중요하다.

 

 

 

 

 

 

3. 역전파 구현하기

역전파는 말 그대로 출력에서부터 거꾸로 들어간다. 

 

1. 선형 연산 가중치 W, B 구하기

선형 연산 가중치 W, B는 구하기 쉽다. 이전 MPL 딥러닝을 정주행하면 쉽게 이해할 수 있다.

 

 

 

 

 

 

2. 합성곱 연산 가중치 W, B 구하기

합성곱 연산 가중치 W, B 가중치 구하는 것이 문제다. Max pooling과 Conv2D 연산에서 이미지 shape이 바뀌는 것을 반대로 해 주어야 한다. 

 

먼저 3 × 3 필터의 역전파를 알아보자. im2col 연산에서 W는 (3, 3) → (1, 9) shape으로 변한다.

5번 과정인 최대값 선택 전으로 되돌리기를 주목하자. 순전파에서 최대 풀링 결과 최대값 1개를 선택하여 4 → 1로 줄어들었으므로 역전파 시 1 → 4개로 늘려야 한다. (모르겠으면 순전파를 다시 보고 오세요. choose Max 과정을 통해 (batch, 4, 14*14) → (batch, 1, 14*14)로 감소함.) 따라서 첫 번째 행을 4개로 복사해야 한다.

 

각 과정을 순전파와 비교해 가면서 천천히 살펴보면 좋다. (정말 반대로 가는 것을 볼 수 있다.)

 

 

 

편향 B도 위의 W 과정과 거의 동일하다.

역전파 마지막에서 적절하게 sum 연산을 해 주어 W, B의 shape에 맞게 조절해 주자.

 

이게 진짜 분류가 가능할까? 

 

다음 시간에 이전까지 구현한 코드를 가지고 직접 코드로 구현해 보겠다.