1. 문제제기
아래 예시와 같이 원과 네모를 구별하는 문제가 있다. 3살짜리 아이도 맞출 만큼 굉장히 쉬운 문제다.
실전을 들어가 보자.
3 × 3 크기의 합성곱 필터 1개를 이용하여 합성곱 → relu → 2 × 2 필터 Max pooling → 분류기 fc → sigmoid를 이용하여 원과 네모를 분류할 수 있을까?
데이터를 구해보자. 본인은 데이터를 구할 때 kaggle을 열심히 이용한다.
아래와 같이 용량도 적절한 데이터를 찾았다. CC0:Public Domain 라이센스도 맘에 든다.
149.2kB인 착한 용량도 마음에 든다.
이 데이터는 원(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에 맞게 조절해 주자.
이게 진짜 분류가 가능할까?
다음 시간에 이전까지 구현한 코드를 가지고 직접 코드로 구현해 보겠다.
'파이썬 프로그래밍 > Numpy 딥러닝' 카테고리의 다른 글
37. [CNN기초] 다채널(multi channel) 다루기 (0) | 2023.02.18 |
---|---|
36. [CNN기초] 원, 네모를 구별하는 CNN 만들기(실습) (2) | 2023.02.01 |
34. [CNN기초] Max pooling, Average pooling 구현 (0) | 2023.01.26 |
33. [CNN기초] 이미지의 합성곱 훈련 -쉬운예제(실습)- (0) | 2023.01.21 |
32. [CNN기초] 이미지의 합성곱 훈련 -쉬운예제(이론)- (0) | 2023.01.20 |