CNN의 레이어(컨볼루션,풀링)을 학습하고 다중분류문제 해결을 위한 심층신경망 모델을 구현해본다.
- Convolution operation, Pooling operation
- CNN에서 사용되는 용어 (Padding, Stride, filter, channel, ...)
- Advantages of Conv layer
- CNN 모델 훈련 과정
64*64(*3) → 12288
의 크기를 가졌다. 1000*1000(*3) → 3millions
크기를 가진다. 이러한 input feature와 첫번째 은닉레이어에 1000개의 은닉유닛이 있다고 가정하면, 이 (1000,3millions) 형태가 되고, 30억개의 모수를 가지게 되는 것이다.📍 Convolution Operation
Convolution layer는 Convolution연산으로 입력 이미지의 특징을 추출한다. 연산과정을 살펴보자.
입력과 필터/커널의 원소값을 곱한 값을 모두 더한 값을 출력한다.
- Filter(kernel) 는 보통 3x3 or 5x5를 사용한다.
- 합성곱 연산의 결과를 특성맵 feature map이라고 한다.
- 위의 예시에서 필터의 크기는 3x3이고, 필터의 이동 범위 stride는 1이지만, 다르게 정할 수도 있다.
- 딥러닝 프레임워크에는 합성곱 convolution 연산 함수가 구현되어 있다.
- python :
conv_forward
- tensorflow :
tf.nn.conv2d
- keras:
conv2D
합성곱 연산으로 어떻게 윤곽선/모서리(vertical edges, horizontal edges)를 감지할 수 있을까?
vertical edges
수직 윤곽선을 감지하는 사례를 convolutional operation 관점에서 살펴보자.
앞서 살펴본 예시와 반대인 케이스를 살펴보자.
세로, 가로 윤곽선을 검출해내는 필터는 다른 형태를 보인다.
Horizontal Edge도 작은 이미지 예시를 보자.
필터에 어떤 숫자 조합을 사용해야할까?!
딥러닝에서는 복잡한 이미지의 윤곽선을 검출할 때 9개의 숫자를 직접 고를 필요없다. 이 숫자를 변수로 설정한 뒤, backpropagation을 사용해 학습된 3x3 filter의 숫자를 합성곱 연산으로 입력 이미지의 전체에 적용해 어떤 형태의 윤곽선도 검출할 수 있도록 할 것이다.
단점을 해결하기 위해서 합성곱 연산을 하기 전에 이미지 주위에 추가로 하나의 경계를 덧대는 방법 패딩 Padding을 살펴보자. 일반적으로 값을 0으로 채우는 제로 패딩(zero padding) 을 사용하고, =1인 경우는 다음과 같다.
최종 이미지의 크기는 x 이다.
이미지 크기, 패딩 크기, 필터 크기를 의미한다.
Valid convolutions : no padding
size of an input image | size of a filter | padding | size of an output image |
---|---|---|---|
n×n | f×f | no padding, p=0 | n−f+1×n−f+1 |
6 | 3 | 6−3+1=4⇒4×4 |
Same convolutions : pad so that output size is the same as the input size 패딩을 한 뒤 output 이미지의 크기가 input 이미지의 크기와 동일하다.
size of an input image | size of a filter | padding | size of an output image |
---|---|---|---|
n×n | f×f | p=1 | n+2p−f+1×n+2p−f+1 |
6 | 3 | 6+2−3+1=6⇒6×6 |
distinguisher
로 용이하게 쓰인다. 최종 이미지의 크기는 × 이다.
이미지 크기, 패딩 크기, 필터 크기, 스트라이드 크기를 의미한다.
Stride 스트라이드 는 필터의 이동 횟수를 의미한다. 앞서 살펴본 예시에서는 필터가 한칸씩(stride=1) 이동해서 계산했지만, 스트라이드에 다른 수를 지정하면 그 수만큼 필터가 이동해서 계산한다.
7×7 input image & 3×3 filter with a stride of 2 의 예시를 보자.
size of an input image | size of a filter | padding | stride | size of an output |
---|---|---|---|---|
n×n | f×f | p | s | +1×⌊+1 |
7 | 3 | 0 | 2 | (7-3+0)/2+1 ⇒3×3 |
이때, 분수가 정수가 아닐 경우 내림값을 구한다. (⌊⌋ = floor() 내림을 의미)
보통은 필터가 패딩을 더한 input 이미지에 맞게 (크기가 정수가 될 수 있도록) 패딩과 스트라이드 수치를 설정 후, 결과를 계산한다.
p=1, strides =2 연산과정
우리가 배운 합성곱은 사실 교차상관cross-correlation
이지만 딥러닝에서는 관습적으로 합성곱이라고 부른다. 일반적 수학적 정의와 어떤 차이가 있는 지 확인해보자.
일반적으로 수학에서 정의하는 합성곱은 요소들을 곱하고 더하는 과정(합성곱 연산) 전에 필터를 가로축과 세로축으로 뒤집는 연산을 해준다. flipping computation: flipping vertically and horizontally
가로축과 세로축으로 필터를 아래 이미지처럼 뒤집은 뒤, 우리가 아는 합성곱 연산을 수행한다.
수학의 특정분야, 신호처리 분야에서는 flipping연산을 하는 것이 합성곱 연산이 특수한 성질인 결합법칙 associativity (A*B)*C=A*(B*C)
를 가지게해 유용하다.
그러나, 딥러닝에서는 뒤집는 연산을 생략하고, convolution이라고 부른다. 이 뒤집는 과정은 신호처리에서는 유용하지만 심층 신경망 분야에서는 아무런 영향이 없기 때문이다.
이미지에 색상(RGB)이 들어가면 입체형으로 변하게 되고, 차원이 하나 증가해 (높이 x 넓이 x 채널) 형태가 된다. 여기서 채널channel은 색상 또는 입체형 이미지의 깊이를 뜻한다. 이에 따라 합성곱에 사용되는 하나의 필터도 각 채널 별로 하나씩 증가하게 된다.
여러 개의 윤곽선을 감지하려면, 여러개의 필터를 동시에 사용하게 된다. what if we want to use multiple filters at the same time?
위와 같이 두개의 필터를 사용한다고 가정해보자. 입력 이미지와 2
개의 filter 각각 convolution 연산을 통해 2개의 얻은 2개의 4×4 outputs 쌓아 4×4×2
output volume을 얻는다. output volume은 다수의 필터를 사용했음을 의미하고, 4×4×2 volume 박스형태로 그리기도 한다. 해당 예시에서 10개의 필터를 사용했을 경우, output volume은 4x4x10이 된다.
Convolution on volumes
* 이미지크기, 채널 수, 필터크기, 사용된 필터 수
Convolution Network with two filters 의 한 레이어를 나타낸 것이다.
even in the very large image with just a very small number of parameters
CNN의 이러한 특징은 과적합을 방지한다.📍Summary of ConvNet
- Notation
- : 번째 계층
- : 필터의 크기
- : 패딩의 양
- : 스트라이드 크기
- : 이미지의 높이
- :이미지의 넓이
- : 채널의 수
- : 필터의 수
- Application
- 다음 연산이 번째 층의 연산이면,
이전 층 의 이미지의 크기 :
그 결과로 나오는 이미지의 크기 :- 번째 층의 높이 혹은 넓이의 크기연산 공식
- Computation
- 개의 크기가 인 필터가 합성곱 연산을 진행
- 활성화 함수를 거쳐 번째 층의 결과값 계산
- 합성곱 연산에 사용된 변수는 총 개, 추가된 편향까지 더하면 한 층의 합성곱 신경망에 필요한 변수는 개
- 기존의 단순 신경망의 가중치행렬 의 크기 인데, 이보다 더 적은 변수로 계산이 가능해 진 것이다.
- EX) 28 x 28 x 3 이미지, 동일한 5 x 5 필터 20개, 패딩없고 스트라이드는 1 → 24 x 24 x 20 크기의 output
- 합성곱 연산에 필요한 총 변수의 크기는 5 x 5 x 3 x 20 + 20(bias) = 1520 이다. 반면, 단순 신경망을 사용하여 같은 크기의 결과를 나타내려면 (28 x 28 x 3) x (24 x 24 x 20) + (24 x 24 x 20) = 27,106,560 만큼의 변수가 필요하다.
valid convolution예를 통해서 앞서 학습한 공식, notation을 적용해보자.
Types of layer in a convolutional network
Pooling Layer는 convolution layer의 출력 데이터를 입력으로 받아 풀링연산을 통해 출력 데이터(Activation map)의 크기를 줄여 연산 속도를 높이고, 특징을 더 잘 검출할 수 있게 한다.(특정데이터를 더 강조)
일반적으로 ConvNet에서는 Convolution layer (합성곱 연산 + 활성화 함수) 다음에 Pooling layer를 추가한다.
📍 Pooling layer Operation
- x x ⇒ pooling layer ⇒ ⌊+1⌋ x ⌊+1⌋ x
size of an input image filter size stride padding type of pooling size of an output image x x f×f s p=0 (rarely used) Maxpooling or Averedge pooling ⌊+1⌋ x ⌊+1⌋ x Max pooling
정사각 행렬의 특정 영역 안에 값의 최댓값을 모으는 방식으로 동작한다. max pooling에서는 패딩을 잘 사용하지 않는다 p=0. (한가지 예외는 존재)Average pooling
정사각 행렬의 특정 영역의 평균을 구하는 방식으로 동작한다.Summary of pooling
- 학습할 parameter는 없고 Hyperparameter(,, Max or average pooling)만 존재하기 때문에 fixed computation이다.(경사하강법, 역전파를 적용할 변수가 존재하지 않는다.)
- OR 자주 사용
- CNN에서는 주로 Max pooling을 사용한다.
- 한가지 예외 존재 ( 심층 신경망 7x7x1000 > 1x1x1000 )
x x ⇒ ⌊+1⌋ x ⌊+1⌋ x- pooling layer를 지나면 행렬의 크기가 감소한다.
shrinking the height and width
- pooling layer를 지나더라도 채널 수()는 변경되지 않는다.
- pooling은 각 채널에 개별적으로 적용되기 때문이다.
dimensions of particular volumes and the number of parameters
Activatonshape | Actiovationsize | # of parmeters | |
---|---|---|---|
Input | (32×32×3) | 3027 | 0 |
Conv1 (f=5,s=1) | (28×28×3) | 6272 | 208 |
Pool1 | (14×14×8) | 1568 | 0 |
Conv2 (f=5,s=1) | (10×10×16) | 1600 | 426 |
Pool2 | (5×5×16) | 400 | 0 |
FC3 | (120×1) | 120 | 48001 |
FC4 | (84×1) | 84 | 10081 |
softmax | (10×1) | 10 | 841 |
완전 연결 층 FC 대신 합성곱층 Conv를 사용할 때 2가지 이점 : parameter sharing, sparsity of connections
(32×32×3)차원의 입력 이미지는 (5×5×3) 크기의 filter 6개
와 합성곱 연산을 통해 (28×28×6)차원의 결과값을 얻는다. 이 때 연산에서 필요한 파라미터는 ((5×5×3)+1)X6 = 456개이다.
(32×32×3) → 3,072개의 유닛을 하나의 레이어에 두고 (28×28×6) → 4,704 유닛들을 다음 레이어에 둔 뒤 각각 뉴런들을 모두 연결Fully Connected하면 3072 x 4704 약 14만개의 파라미터가 필요하다. 입력이미지가 작음에도 불구하고 변수가 많이 필요하고, 입력값이 커질수록 가중치 행렬이 연산 불가능할 정도로 커진다.
합성곱신경망이 이렇게 적은 변수를 필요로하는 이유를 살펴보자.
vertical edge detector 세로 윤곽선 검출을 위해 (3x3) 필터
를 사용한다고 생각해보자. 이 필터는 윤곽선 혹은 다른 특성들을 검출하기 위해 입력 이미지의 여러 위치에서 동일하게 사용될 수 있다. 9개의 변수를 공유하며 16개의 출력을 계산하는 것은 변수의 개수를 줄이는 방법 중 하나이다. 이는 윤곽선과 같은 하급 속성뿐만 아니라합성곱 신경망의 변수공유와 희소연결
이라는 특징때문에 신경망 변수가 줄어들어 작은 훈련 세트를 가지게하고, 과대적합도 방지할 수 있다 .
Car detector 예제로 전체적인 흐름을 보자.
x
image y
binary label(or K-classes)convolutional neural network structure
Parameters & CostFunction
Training
: gradient descent or some other optimization algorithm(gradient descent with momentum) to reduce J.Source and Reference
cs231n | CNN More On Edge Detection | datadriveninvestor | towardsdatascience