본문 바로가기

데이터/머신러닝

[혼공] ch 8-1. 합성곱 신경망의 구성 요소

1. 합성곱

 

합성곱(convolution)

- 밀집층과 비슷하게 입력과 가중치를 곱하고 절편을 더하는 선형 계산 

- 1개 이상의 합성곱 층을 쓴 인공 신경망 

 

- 인공 신경망은 처음에 가중치 w1~w10과 절편 b를 랜덤하게 초기화한 다음 에포크를 반복하면서 경사 하강법 알고리즘을 사용하여 손실이 낮아지도록 가중치와절편을 찾아간다. 

- 합성곱은 밀집층의 계산과는 조금 다르다. 입력 데이터 전체에 가중치를 적용하는 것이 아니라 일부에 가중치를 곱한다. 

 

- 가중치 w1~w3이 입력의 처음 3개 특성과 곱해져 1개의 출력을 만든다 ,이 뉴런이 한 칸 아래로 이동해 두 번째부터 네 번째 특성과 곱해져 새로운 출력을 만든다.

 

 

- 첫 번째 합성곱에서 사용된 가중치 w1~w3과 절편 b가 두 번째 합성곱에도 동일하게 사용된다. 

- 이렇게 한 칸씩 아래로 이동하면서 출력을 만드는 것이 합성곱이다. 

- 여기에서는 이 뉴런의 가중치가 3개이기 때문에 모두 8개의 출력이 만들어진다. 

 

 

- 밀집층의 뉴런은 입력 개수만큼 10개의 가중치를 가지고 1개의 출력을 만든다. 합성곱 층의 뉴런은 3개의 가중치를 가지고 8개의 출력을 만든다. 

 

- 합성곱 신경망(convolutional neural network, CNN)에서는 완전 연결 신경망과 달리 뉴런을 필터(filter) 또는 커널(kernal)로 부른다. 

 

- 합성곱 계산을 통해 얻은 출력을 특성 맵(feature map)이라고 부른다. 

 

 

- 밀집층에 있는 뉴런의 가중치가 모두 다르듯이 합성곱 층에 있는 필터의 가중치(커널)도 모두 다르다. 

 

 

2. 케라스 합성곱 층 

 

- 케라스 층은 모두 keras.layers 패키지 아래 클래스로 구현되어 있다. 합성곱 층도 마찬가지 이다. 

- 특별히 입력 위를 (왼쪽에서 오른쪽으로, 위에서 아래로) 이동하는 합성곱은 Conv2D 클래스로 제공한다. 

 

from tensorflow import keras
keras.layers.Conv2D(10,kernel_size=(3,3), activation='relu')

 

- Conv2D 클래스의 첫 번째 매개변수는 필터의 개수이다. kernel_size 매개변수는 필터에 사용할 커널의 크기를 지정한다. 

마지막으로 밀집층에서처럼 활성화 함수를 지정한다.

 

 

페딩과 스프라이트 

 

패딩(padding)

- 입력 배열 주위를 가상의 원소로 채우는 것

- 실제 입력값이 아니기 때문에 패딩은 0으로 채운다. 

 

세임 패딩(same padding)

- 입력과 특성 맵의 크기를 동일하게 만들기 위해 입력 주위에 0으로 패딩하는 것

 

밸리드 패딩(valid padding)

- 패딩 없이 순수한 입력 배열에서만 합성곱을 하여 특성 맵을 만드는 경우 

 

- 적절한 패딩은 이미지의 주변에 있는 정보를 잃어버리지 않도록 도와준다. 

- 일반적인 합성곱 신경망에서는 세임 패딩이 많이 사용된다. 

 

- 케라스 Conv2D 클래스에서는 padding 매개변수로 패딩을 지정할 수 있다. 

- 기본값인 'valid'로 밸리드 패딩을 나타낸다. 

- 세임 패딩을 사용하려면 'same'으로 지정한다. 

 

keras.layers.Conv2D(10,kernel_size=(3,3), activation='relu', padding='same')

 

 

스트라이드(stride)

 

- 합성곱 층에서 필터가 입력 위를 이동하는 크기 

- 일반적으로 스트라이드는 1 픽셀을 사용한다. 

 

 

폴링(pooling)

 

- 합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄이는 역할

- 하지만 특성 맵의 개수는 줄이지 않는다. 

 

ex)

- (2,2,3) 크기의 특성 맵에 폴링을 적용하면 마지막 차원의 개수는 그대로 유지하고 너비와 높이만 줄어들어 (1,1,3) 크기의 특성 맵이 된다. 

 

- 폴링에는 가중치가 없기 때문에 가장 큰 값을 고르거나 평균값을 계산한다. 이를 각각 최대 폴링(max pooling), 평균 폴링(average pooling)이라고 부른다. 

 

- 폴링에서는 겹치지 않고 이동한다. 

 

- 케라스에서는 MaxPooling2D 클래스로 폴링 수행 가능

 

keras.layers.MaxPooling2D(2)

 

- MaxPooling2D의 첫 번째 매개변수로 폴링의 크기를 지정한다.  대부분 폴링의 크기는 2리다. 

- 합성곱 층과 마찬가지로 strides와 padding 매개변수를 제공한다. 

- strides의 기본값은 자동으로 폴링의 크기이므로 따로 지정할 필요가 없다. 

- padding의 기본값은 'valid'로 패딩을 하지 않는다. 

 

keras.layers.MaxPooling2D(2,strides=2, padding='valid')

 

- 평균 폴링을 제공하는 클래스는 AveragePooling2D이다. 

- 많은 경우 평균 풀링보다 최대 풀링을 많이 사용한다. 

- 풀링은 가세로 방향으로만 진행한다. 특성 맵의 개수는 변하지 않고 그대로이다. 

 

 

3. 합성곱 신경망의 전체 구조 

 

 

 

- 합성곱 층에서 사용할 커널의 크기는 (3,3) 크기이고 세임패딩이므로 1픽셀이 입력 데이터 주변에 추가된다 .

- 합성곱의 필터는 3이다. 각각 (3,3) 크기 가중치를 가지고 있으며 필터마다 절편이 하나씩 있다. 

- 합성곱의 스트라이드는 항상 1이다. 따라서 만들어지는 특성맵의 크기는 입력과 동일한 (4,4)이다. 

- 3개의 필터가 하나씩 합성곱의 출력을 만들고 이 출력이 합쳐져서 (4,4,3) 크기의 특성 맵이 만들어진다. 

- 합성곱 층은 활성화 함수로 렐루 함수를 많이 사용한다. 

 

- 폴링층은 합성곱 층에서 만든 특성 맵의 가로세로 크기를 줄인다. 

- 보통 (2,2) 폴링을 사용해 절반으로 줄인다. 

- 특성 맵의 개수는 변하지 않으므로 (4,4,3)에서 (2,2,3)으로 특성 맵 개수는 유지된게  보인다. 

 

- 폴링을 사용하는 이유는 합성곱에서 스트라이드를 크게 하여 특성맵을 줄이는 것보다 폴링 층에서 크기를 줄이는 것이 경험적으로 더 나은 성능을 내기 때문이다. 

 

- 폴링을 거친 특성 맵의 크기는 절반으로 줄었기 때문에 (2,2,3)이 된다. 밀집층인 출력층에 전달하려면 이 3차원 배열을 1차원 배열로 펼쳐야 한다. 

 

- 출력층에는 3개의 뉴런을 두었다. 즉 3개의 클래스를 분류하는 다중 분류 문제이다. 

 

 

컬러 이미지를 사용한 합성곱 

 

- 하나의 컬러 이미지는 너비와 높이 차원 외에 깊이 차원이 있다. 

- 입력이나 필터의 차원이 몇 개인지 상관없이 항상 출력은 하나의 값이다. 

- 케라스의 합성곱 층은 항상 3차원 입력을 기대한다, 

 -> 만약 패션 MNIST 데이터처럼 흑백 이미지일 경우에는깊이 차원이 1인  3차원 배열로 변환하여 전달한다. 

 

- 합성곱 신경망은 너비와 높이는 점점 줄어들고 깊이는 점점 깊어지는 것이 특징이다. 

- 합성곱 신경망에서 필터는 이미지에 있는 어떤 특징을 찾는다고 생각할 수 있다.