08-1 합성곱 신경망의 구성요소 ( 채널, 패딩, 폴링 )
합성곱 ( convolution) : 이미지의 유용한 특징,특성을 드러내게 하는 역할을 함.
이미지처리에 좋은 성능을 낼 수 있다!!!
앞서 배운 인공신경망의 dense에서는 입력개수마다 가중치가 있다. (모든 입력에 가중치가 존재)
뉴런(=출력층)
앞에서 MNIST 이미지는 784개의 픽셀을 입력받는 은닉층의 뉴런 개수가 100개 => 출력도 100개였다.
합성곱은 위와 다르게 입력데이터 전체에 가중치를 적용X
일부에만 가중치를 곱한다.
일부 = n개의 픽셀에만 !!
합성곱은 한번의 연산으로 끝나지않음!!
그림으로 이해해보자.
총 8개의 출력 (3,1,0), (1,0,7),,,,,,(2,4,5)
가중치 w1,w2,w3은 모두 같은 값
앞에서 배운 밀집층의 뉴런은 입력개수만큼 10개의 가중치를 가지고 1개의 출력을 생성.
합성곱 신경망은 3개의 가중치를 가지고 8개의 출력을 생성
합성곱에서 사용할 가중치의 개수 = 하이퍼파라미터!!!!!!!!!!!!
CNN에서는 뉴런 = 필터 이라고 생각하면 된다.
뉴런 개수 = 필터
가중치 = 커널 ( 도장)
한 개의 필터 : 빨간 박스 = 3x3의 총 9개의특성 x 9개의 가중치 = 1개의 출력
+ 3번 더 이동하여 총 4개의 출력!!!
이를 2차원으로 표현하자면
1번 출력 | 2번 출력
-------------------------- 이렇게 행렬?처럼 나타낼 수 있다.
3번 출력 | 4번 출력
위와 같이 (2,2) 크기를 쌓으면 3차원 배열이 된다.
만약 필터가 3개가 있다면 (2,2,3)인 3차원 배열로 표현할 수 있다.
구현하기
합성곱 = Conv2D
매개변수 ==> 필터의 개수, 커널사이즈=커널의크기, 활성화 함수, 패딩, 스트라이드
keras.layers.Conv2D(10, kernel_size=(3,3), activation = 'relu', padding='same', strides=1)
패딩 / 스트라이드
위의 예시는 (4,4)크기의 입력에 (3,3)크기의 커널(가중치, 도장)을 적용하여 (2,2)크기로 압축? 특성맵을 만들었다.
그런데 만약 커널 크기는 (3,3) 그대로하고 출력의 크기를 (4,4)로 만들고 싶다면???
--> 입력(4,4)과 동일한 크기의 출력을 만드려면 마치 더 큰 입력에 합성곱하는 척해야 한다.!!
예를 들어 , 사실은 4x4이지만 6x6처럼 바꿔준 후 3x3 커널로 합성곱하면 4x4특성 맵으로 만들 수 있다.
그림으로 이해하기
이렇게 주위를 가상의 원소로 채우는 것을 패딩이라고한다.
(추우니까 두껍게 입자=패딩)
위와 같이 입력/특성을 맞추기 위해 주위를 0으로 패딩하는것 = 세임 패딩
패딩없이 순수한 배열 그대로 합성곱 해서 특성 맵을 만드는것= 밸리드 패딩
keras.layers.Conv2D(10, kernel_size=(3,3), activation = 'relu', padding='same', strides=1)
위 padding => 기본값은 밸리드이다. 세임하고싶은 'same'이라고 써주기!
그리고 도장(커널)은 한 칸씩 이동하는데, 만약 두 칸씩 이동한다면 특성 맵( 출력 ) 은 반토막이 날 것이다.
이렇게 n칸씩 지정하는 것을 스트라이드라고 하고, 기본값은 1이다 !!!
폴링 ( pooling )
풀링: 합성곱 층에서 만든 특성 맵의 가로세로의 크기를 줄이는 역할
그림으로 이해
위 그림처럼 (2,2,3) 특성맵에 풀링을 적용하게되면 마지막 차원인 개수!만 유지하고 너비,높이가 줄어듦 (1,1,3)
위 그림에서는 2,2 -> 1,1로 축소
도장을 찍은 영역에서 가장 큰 값 / 평균 값을 계산하는데, 이를 최대풀링, 평균풀링이라고 한다.
특성맵 4개중에서 가장 큰 값 고르고, 그렇게 총 4개를 골랐다면, 그값으로 이루어진 축소 특성맵을 생성!!!!!!!!!!!!!!!!
그림으로 추가 설명
위 그림에서 stride = 2인것 또한 확인할 수 있다.
keras.layers.Maxpooling2D(2, strides=2, padding='valid')
괄호안에 숫자는 풀링의 크기를 지정이다!!!
총정리