코딩일기

[Deep Learning] 6. Convolutional Neural Network(feat. CNN) 본문

Code/딥러닝(NL)

[Deep Learning] 6. Convolutional Neural Network(feat. CNN)

daje 2021. 5. 5. 01:39
728x90
반응형

 

 

 

안녕하십니까 다제 입니다. 

오늘부터는 딥러닝 이미지처리에 대해서 포스팅을 진행하고자 합니다. 

딥러닝의 이미지처리는 Convolutional Neural Network(CNN) 이전과 이후로 나눌 수 있습니다.  

 

CNN이란? 이미지에서 인접한 픽셀간의 연관성을 학습시키기 위해 이미지를 convolution하여 인공신경망 학습을 진행하는 방법입니다. 

 

CNN 이전에는 Fully-connected Multi-layered Neural Network(FNN) 학습 방식을 사용하였으나, 여러 가지 문제점이 있었다고 하네요. 과연 어떤 문제점이 있었고, CNN은 어떻게 이를 극복하였고, 작동원리와 코드는 어떻게 되는지 한번에 쭉~ 살펴보도록 하겠습니다. (해당 포스팅을 하며, 참고하였던 링크는 하단에 기재하였습니다.)

 

 


 

1. 등장배경이 무엇인가?

 -. CNN이 나오기 이전 이미지 인식은 2차원으로 이미지(채널까지 포함 3차원)를 1차원 배열로 바꾼 뒤 FNN (Fully- connected multi layered Neural Network) 신경망으로 학습시키는 방법 이었습니다. 

 -. FNN의 문제점은 Flatten화하는 과정에서 구조적으로 인접 픽셀간의 상관관계(연관성)가 무시된다는 점 입니다. 

 -. 인접 픽셀간의 상관관계(연관성)가 무시되어 중요한 정보가 손실된다는 문제점이 발생하게 됩니다. 
 -. 또한, 각 노드마다 가중치가 존재하기 때문에 연산량이 급격히 증가한다는 문제가 발생됩니다. 

 -. 이에, filter를 이용하여 픽셀을 3 *3 행렬 단위로 묶고 이를 Flatten화하여 인접 픽셀에 있는 공간적인 정보를 담을 수 있고,  위와 같은 문제를 해결할 수 있게 되었습니다. 

 

 


 

2. Convolution은 무엇인가?

 

 -. 위 그래프에서 빨간색 그래프(f)가 이미지이고 x축의 0~1 사이에 특정한 정보를 담고 있다고 생각해주세요

 

 -. 위 그래프에서 파란색 그래프(g)가 그래프(f)에 놀러가서 왼쪽에서 오른쪽으로 지나가고 있다고 생각해주세요

 -. 또한, g 그래프를 좌우반전하여 위와 같은 f래프를 지나게 합니다. 

 

 -. 이렇게 생성된  f * g 와 g * f를 적분하여 아래와 같이 그래프를 만들게 되는데 이를 convolution이라고 한다. 

 

 -. 이게 바로 Convolution의 개념이며, 이러한 수학적인 개념을 딥러닝 이미지에 적용하여 등장한 것이 바로 Convolutional Neural Network(CNN)입니다.

-. 조금 더 사전적 의미로 이야기하자면 하나의 함수와 또 다른 함수를 반전 이동한 값을 곱한 다음, 구간에 대해 적분하여 새로운 함수를 구하는 수학 연산자를 의미합니다. 

-. 이제 바로 CNN이 어떻게 작동하는지 원리에 대해서 함께 살펴보도록 하겠습니다. 

 


 

3. 작동원리가 무엇인가?

 -. 3*3행렬이 이미지를 한 픽셀씩 이동하면서 각각의 픽셀과 연산을 진행하게 된다. 

 -. 우리는 3*3행렬을 filter라고 부르며, 이 필터가 픽셀씩 이동하면서 연산을 진행하는 방식을 sliding window라고 한다. 이러한 방식을 통해 FNN이 가지고 있는 공간적 정보를 담지 못한다는 단점을 극복하였다. 

 -. 이렇게 sliding window 방법으로 filter가 이미지와 연산하는 과정을 pooling이라고 하며, pooling을 통해 만들어진 행렬을 Feature Map이라고 부른다. FNN과 다르게 각각의 픽셀마다 가중치가 별도로 있는 것이 아니고, filter라는 공통된 가중치를 사용하게 된다. 이에, 연산량이 줄어드는 효과가 발생된다.  

 -. 여기서 Feature Map에는 당연히 특정한 연산에 의해 해당 픽셀들 중 이미지를 대변하는 특징이나, 특정위치에서 큰 역할을 하는 공강적인 정보를 담고 있으며, 필요없는 정보를 제거하여 과적합을 방지해주는 효과가 있다. 

 -. 그러나, 이러한 합성공 계층을 여러번 거치면서 이미지의 크기는 점점 작아지기게 되고 이미지의 가장자리에 위치한 픽셀들의 정보는 점점 사라지게 된다. 즉, Feature Map이 점점 작아지게 된다. 

 

 

-. 이러한 문제점을 해결하기 위한 것이 패딩이며, 이미지의 가장자리에 특정값으로 설정된 픽셀들을 추가함으로써 입력 이미지와 출력이미지의 크기를 같거나 비슷하게 만드는 역할을 수행한다. 대표적인 패딩의 예로는 zero-padding이 있다. 

 -. 위와 같은 과정을 반복적으로 수행한 후 추출된 특성을 Flatten화하여 fully connected layer에 연결하여 어떤 이미지인지 분류를 진행하게 된다. 

 

-. 넘어가기 전 한가지 확실히 해야하는 개념이 있어서 소개하고자 한다. 

-. 바로 filter와 kernel의 개념이다. 

 * kernel  filter의 차이를 분명히 해야한다. kernel이라는 것은 sliding window 하는 영역에서의 크기이다. 여기에서는 3x3이라고 할 수 있다. filter라는 것은 실제로 kernel이 weighted sum 하는 영역의 크기이다. 여기에서는 3x3x3이라고 할 수 있다. 

 


 

4. 핵심 개념은 무엇인가?

 -. 구성 : Convolution Layer + Pooling Layer + FNN

 -. Pooling Layer

출처 :  https://excelsior-cjh.tistory.com/180

 

 -. convolution을 거쳐서 나온 feature maps(activation map)이 있을 때 이를 이루는 convolution layer을 resizing하여 새로운 layer를 얻으며 대표적인 Pooling은 Max Pooling과 Average Pooling이 있습니다. 

 -. Pooling을 하는 이유는

  1) Pooling을 하면 데이터의 크기를 줄일 수 있으며, Overfitting을 줄일 수 있고 계산량을 줄일 수 있으며,

  2) Pooling을 통해 계산된 특징이 이미지 내의 위치에 대한 변화에 영향을 덜 받게 합니다. 즉, 풀링을 이용하여 불변성을 찾아내서 공간적 변화를 극복할 수 있습니다. ( 하단 이미지 참조 ) 

출처 : 이미지 링크 참조 / 위치 이동에 대해 덜 영향을 받는 예

  * 이미지의 국소적인 부분들을 하나의 대표적인 스칼라 값으로 변환함으로써 이미지 크기를 줄임 

  * 별도의 파라미터가 존재하지 않으며, Pooling 레이어를 통해도 채널 수는 변경되지 않음 

  * 특정위치에서 큰 역할을 하거나, 이미지의 전체를 대변하는 특징을 추출하는 역할을 함 

  * filter는 가중치의 집합으로 이루어져 가장 작은 특징을 잡아내는 창이며, filter를 공유하기에 학습할 가중치가 FNN보다 크게 줄이게 되고, 과적합해결에도 도움을 줌 

  * Max pooling과 Average pooling이 있으며, Max pooling은 filter가 이미지를 가지가는 영역에서 가장 큰 값을 추출하고 Average pooling은 그 영역 값의 평균을 추출하는 방법임 ( 대부분 Max pooling을 사용함 )

 

 -. stride

  * 필터를 입력데이터나 특성에 적용할 때 움직이는 간격을 스트라이드(Stride)라고 한다. 아래 그림에서는 우측으로 1칸씩 이동하는 모습을 관찰 할 수 있다. 

 -. Padding

  * 패딩은 반복적으로 합성곱 연산을 적용했을 때 특성의 행렬의 크기가 작아짐을 방지하고 이미지의 모서리 부분의 정보손실을 줄이고자 이미지 주변에 0으로 채워넣는 방법이며, 꼭 0으로만 채워넣지 않아도 된다. 

출처 : 이미지 링크 참조 

 

 -. 1D Convolution vs 2D Convolution vs 3D Convolution

 * tensorflow 또는 keras에서는 convolution함수가 Conv1d, Conv2d, Conv3d로 구분되어 있으며, 이는 filter의 진행 방향의 차원수를 의미한다. 

 


 

5. 예시 코드는 무엇인가?

from tensorflow.keras import datasets
from tensorflow.keras.models import Sequential, Model # <- May Use
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten

(train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data()

# 이미지가 255*255 shape로 구성되어 있다보니 255로 나눠주어 0과 1사이로 정규화를 시켜주는 코드 
train_images, test_images = train_images / 255.0, test_images / 255.0


# CNN 코드
model = Sequential() 

# Convolution layer & Pooling
# Convolution을 사용하기 위해 우리가 정해주어야 할 것은 1. 필터 수와 2. 필터 사이즈 이다. 
# 아래에서는 32개의 필터와 (3,3) 필터 사이즈를 사용하기로 기재하였다. 
model.add(Conv2D(32, (3,3), activation='relu', input_shape=(32,32,3)))
model.add(MaxPooling2D((2,2)))

# Convolution layer & Pooling
model.add(Conv2D(64, (3,3), activation='relu'))
model.add(MaxPooling2D((2,2)))

model.add(Conv2D(64, (3,3), activation='relu'))

# 여기서부터는 FNN구조와 동일
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dense(10, activation='softmax'))

model.summary()

# 모델학습방식 세팅
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
              
# 모델 학습시키기
model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels))

# 결과확인
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)

 


 

참조문서

 -. 블로그 : yjjo.tistory.com/8

 -. 블로그 : yjjo.tistory.com/9?category=874689

 -. 논   문 : http://vision.stanford.edu/cs598_spring07/papers/Lecun98.pdf

 

 

지금까지 CNN에 대해서 알아보았습니다

추가적으로 궁금하신 사항이 있으시다면 댓글 부탁드립니다. 

좋아요! 공감!도 같이 부탁드립니다. 

 

감사합니다. 

728x90
반응형
Comments