컨브넷(convnet)이라고도 불리는 합성곱 신경망(convolutional neural network)는 컴퓨터 비전 에플리케이션에 사용된다.
그렇다면 왜 컴퓨터비전에서는 MLP(Multi layer perceptron)이 아닌 CNN을 사용할까? 그 이유는 다음과 같다.
x 라는 표시의 이미지를 픽셀 단위로 보았을 때 위는 사람이 인식하기에 동일한 x 이미지이다. 이를 만약 MLP를 사용해 학습하게 되면 MLP에서는 이미지 픽셀1개가 1개의 노드 이므로 위처럼 이미지가 shift하게 되면 노드의 값들이 많이 바뀌게 되어 많은 weight 값들이 무력화 된다.
따라서 CNN은 feature extraction을 통해 이미지를 학습하게 된다. CNN은 Filter값을 사용자가 만들거나 선택할 필요없이 Deep Learning Network 구성을 통해 이미지 분류 등의 목적에 부합하는 최적의 filter값을 학습을 통해 스스로 생성한다.
CNN은 기본적으로 several layers of convolutions이 결과값에 Relu, Tanh 같은 Nonlinear function을 적용한 것들이다. 먼저 input image에 convolution을 적용하여 output을 꺼낸다. 해당 output은 input image의 local connection으로 연결이 되어 있으며, 각각의 layers들은 각기 다른 filters를 적용한다.
위의 이미지에서 첫번째 Conv layer 에서는 edge같은 제일 작은 차원의 특성을 인식할 것이다. 그뒤 점점 뒤의 Conv layer로 갈수록 좀 더 높은 차원 특징(예를 들면 얼굴, 핸드폰, 자동차)을 인식하게 된다.
마지막의 fully connected 는 일반적인 Multi Layer Perceptron이다.
Conv2D(filter=10, kernel_size=3)
를 살펴보면 3x3 사이즈의 kernel로 이루어진 10개의 filter를 적용하겠다는 뜻이다.아래의 사진을 통해 하나의 컬러 이미지에서 Feature Map을 어떻게 생성하는지 알아보도록하자
컬러이미지는 총 R,G,B 3개의 channel 로 이루어져있다. 따라서 하나의 필터는 channel의 수는 input의 channel수와 같다.
필터를 통한 컨볼루션 연산은 CNN에 있어 핵심이기 때문에 여러개의 필터를 사용했을 때 생성되는 Feature Map 또한 알아보도록 하겠다.
위 이미지에서의 핵심은 다음과 같다
- 입력 데이터의 채널수와 상관없이 필터 별로 1개의 Feature Map이 만들어진다 위의 자료를 보면 총 4개의 필터를 사용해 4개의 Feature Map이 생성된것을 볼 수 있다.
- 입력 이미지의 channel과 한개의 filter의 channel은 같아야한다
cnn을 학습하는데에는 많은 parameter가 필요해 많은 시간이 소요된다, 현재 cnn에 우수한 모델들을 parameter수를 줄이면서 성능을 높이는 방향으로 발전되고 있다. 따라서 cnn 아키텍쳐의 parameter의 수를 계산할 수 있어야한다.
parameter를 구하는 방법
parmeter수 = Kernel Size x Kernel Size x input channel x Output Channel
Pooling을 하게되면 Feature Map의 크기를 줄여 위치의 변화에 따른 feature 값의 영향도를 줄여서 오버피팅 감소등의 장점을 얻을 수도 있다. 하지만 최근에는 Pooling의 특징상 특정 위치의 feature값이 손실 되는 이슈 등으로 사용하지 않는 경향을 보이고 있으며 Stride로 Feature Map 크기를 줄이는 것이 Pooling 보다 더 나은 성능을 보인다는 연구 결과가 있다.
Convolutional Layer를 통하여 Feature extraction이 끝나면 해당 Feature Map들을 Flatten 한후 Fully Connected Layer를 통해 학습하게 된다
위는 구글에서 개발한 cnn 초창기 모델인 LeNet-5이다.
첫번째 Full connection 부분을 보면 총 (5,5)사이즈의 16개의 Feature Map을 Flatten해서 개의 input node와 120개의 output node를 가지는것을 확인할 수 있다.
: 6개의 feature map이 있는것으로 총 6개의 filter를 사용한것을 알 수 있다. 이때 한개의 filter의 channel수는 input이미지의 channel수인 3이다.
: 6개의 feature map이 있는것으로 총 6개의 filter를 사용한것을 알 수 있다. 이때 한개의 filter의 channel수는 input으로 받은 의 channel수인 6이다.
: 16개의 feature map이 있는것으로 총 16개의 filter를 사용한것을 알 수 있다. 이때 한개의 filter의 channel 수는 input으로 받은 의 channel수인 6이다.
: 16개의 feature map이 있는것으로 총 16개의 filter를 사용한것을 알 수 있다. 이때 한개의 filter의 channel 수는 input으로 받은 의 channel수인 16이다.
: 120개의 노드를 가지는 fully connected layer
: 84개의 노드를 가지는 fully connected layer
output: output노드가 10개인것은 이 모델이 10개의 분류를 위한 모델이였다는것을 알 수 있다.
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D
from tensorflow.keras.models import Model
input_tensor = Input(shape=(28, 28, 3), name="input")
x = Conv2D(filters=32, kernel_size=3, strides=1, padding="same", activation="relu", name="Conv1")(input_tensor)
x = Conv2D(filters=64, kernel_size=3, activation="relu", name="Conv2")(x)
x = MaxPooling2D(2, name="Max_Pooling")(x)
model = Model(inputs=input_tensor, outputs=x)
model.summary()
Model: "model_3"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) [(None, 28, 28, 3)] 0
Conv1 (Conv2D) (None, 28, 28, 32) 896
Conv2 (Conv2D) (None, 26, 26, 64) 18496
Max_Pooling (MaxPooling2D) (None, 13, 13, 64) 0
=================================================================
Total params: 19,392
Trainable params: 19,392
Non-trainable params: 0
_________________________________________________________________
None은 배치 사이즈이므로 None은 제외하고 model의 summary를 보자
CNN은 최적의 Feature추출을 위한 최적의 weight값을 계산하는 것인데 이 최적의 weight는 바로 필터의 weight값이다.
위에 model.sumarry()
의 결과에서 param이 weight의 개수이다 Conv1, Conv2의 weight를 자세히 살펴보면 다음과 같다.
Conv1을 보게되면 (3x3)커널의 3채널(input이 3개의 채널로 이루어 져있으므로)로 이루어져있는 32개의 filter 이므로 총 param의 개수는
Conv2를 보게되면 Conv1의 output으로 생성된 Feature Map은 28x28x32 의 형태로 총 32개의 채널을 가지고 있어 Conv2에서의 1개의 filter는 3x3x32의 형태를 가지게 되고 이로 인해 총 param의 개수는
출처:
- http://incredible.ai/artificial-intelligence/2016/06/12/Convolutional-Neural-Networks-Part1/
- https://medium.com/@draj0718/zero-padding-in-convolutional-neural-networks-bf1410438e99
- http://incredible.ai/artificial-intelligence/2016/06/12/Convolutional-Neural-Networks-Part1/'
- http://taewan.kim/post/cnn/
- https://ctkim.tistory.com/95
- https://sonsnotation.blogspot.com/2020/11/7-convolutional-neural-networkcnn.html