Deep Learning/from scratch I

[밑바닥부터 시작하는 딥러닝 - 7장 합성곱 신경망(CNN) I]

해파리냉채무침 2024. 2. 10. 19:57

Affine  계층은 fully-connected layer 라고도 한다.

Affine 계층의 네트워크는 다음과 같다. 마지막 5번째 층은 softmax 계층에서 최종결과를 출력한다. 

https://welcome-to-dewy-world.tistory.com/91

CNN(합성곱 계층, convolutional layer)는 합성곱계층(convolutional layer)와 풀링계층이 추가되었다

https://welcome-to-dewy-world.tistory.com/91

affine(a.k.a  fc layer)의 문제점 -> 공간, 색깔 (R G B), 거리 등 3차원속의 의미를 갖는 본질이 무시됨, 같은 차원의 뉴런으로 취급됨

CNN의 특징 -> 3차원적인 형상 유지(이미지 데이터의 특성)

합성곱 연산

http://wiki.hash.kr/index.php?title=%ED%95%A9%EC%84%B1%EA%B3%B1_%EC%8B%A0%EA%B2%BD%EB%A7%9D&mobileaction=toggle_view_desktop

입력은 (4*4), 필터는 (3*3) 출력은 (2*2) 이다. 필터를 kernel 이라고 지칭하기도함

1*2+0*2+3*1+0*0+1*1+2*2+3*1+0*0+1*2 = 15  이런식으로 필터 위치에 맞는 데이터를 곱해서 더해준다

http://wiki.hash.kr/index.php?title=%ED%95%A9%EC%84%B1%EA%B3%B1_%EC%8B%A0%EA%B2%BD%EB%A7%9D&mobileaction=toggle_view_desktop

CNN에도 편향을 적용할 수 있다. 합성곱 연산 후 필터를 적용한 모든 원소에 더해준다

패딩

폭이 1인 패딩을 추가하면 6*6이 된다. 만약 패딩을 2로 설정하면 8*8이 되고, 3으로 설정하면 10*10이 된다.

패딩을 하는 이유는 합성곱 연산을 계속하다보면 어느 시점에서 출력이 1이 되고, 더이상 합성곱 연산을 할 수 없게 된다.

이러한 현상을 방지하기 위해 패딩을 수행한다.

stride

https://www.analyticsvidhya.com/blog/2022/03/basics-of-cnn-in-deep-learning/

스트라이드는 필터를 적용하는 위치의 간격을 의미한다.  stride를 2로 하면 두칸씩 움직인다. 

 

입력, 패딩, 스트라이드, 출력의 관계의 수식은 다음과 같다

입력 크기는(H,W), 필터 크기는 (FH, FW), 출력 크기는 (OH, OW), 패딩은 P , 스트라이드를 S라고 한다 

https://huangdi.tistory.com/12

ex) 입력이 (4,4), 패딩 1 ,스트라이드 1, 필터(3,3) 

OH : (4+2*1-3)/1 +1 = 4

OW:  (4+2*1-3)/1 +1 = 4

이 값들이 정수로 나눠떨어지게 해야함

https://huangdi.tistory.com/12

3차원 데이터 합성곱 연산 시 input data 채널 수 필터의 채널 수가 같아야함

배치 처리

https://huangdi.tistory.com/12

배치용 차원을 추가하여 데이터 N개에 대한 합성곱 연산을 수행한다. 

필터의 가중치 데이터는 4차원, (출력 채널 수, 입력 채널 수, 높이, 너비) 순으로 쓴다.

만약  채널 수 3, 크기 5*5, 필터 20개라면 (20,3,5,5)로 쓴다.  합성곱 신경망에 편향을 더해서 출력데이터를 도출한다. 

 

풀링 계층

https://paperswithcode.com/method/max-pooling

2*2이면 stride 2로 처리되어 있고, 만약 윈도우가 3*3이면 stride는 3, 4*4는 stride를 4로 설정한다.

max pooling은 해당 영역에서 최대의 원소를 선정하고, average pooling은 대상영역의 평균을 계산한다

풀링 계층의 특징은 다음과 같다

- 학습해야 할 매개변수가 없음

- 채널 수가 변하지 않는다

- 데이터가 어느 방향으로 한칸 움직여도 풀링의 결과는 잘 변하지 않는다.

 

높이 28, 너비 28, 채널 1개 데이터가 10개 

import numpy as np
x = np.random.rand(10,1,28,28)#무작위를 데이터 생성
x.shape

 

im2col

im2col(image to column) 은 입력 데이터를 필터링(가중치 계산) 하기 좋게 전개하는 함수다

3차원 입력을 2차원 행렬로 변환해준다. 

https://welcome-to-dewy-world.tistory.com/94

입력 데이터에서 필터를 적용하는 영역를 한줄로 늘어놓음. 합성곱 계층의 필터를 1열로 전개하고, 두 행렬의 곱을 계산함. 계산 후 출력 데이터를 4차원으로 reshape 한다.