티스토리 뷰
Convolutional Neural Network(CNN) _기초 개념
HAN_PY 2021. 2. 22. 22:11사실 비전공자인 필자는 처음 CNN을 처음 배울 때, CNN이 무슨 말인지 하나도 몰랐다. 그래서 그때를 생각하며 최대한 이해가 쉽도록 글을 적어보겠다. 일단 신경망에 대한 기초는 알고 있다고 판단하고 글을 적겠다. 만약 시간이 없다면, 최소한 input_layer, hidden_layer, output_layer에 대한 개념을 알아보고 계속 글을 읽자.
기본적으로 CNN은 image를 분류하기 위한 개발된 Network이다. 따라서 image에 최적화 되어 있다는 점을 인지하자. 그리고 image는 픽셀로 되어 있다. 픽셀의 색을 컴퓨터가 이해할 수 있도록 숫자로 변경을 한 후에 신경망을 통해 계산을 하는 것이다. 그렇다면, 딥러닝인 CNN이전의 머신러닝 시절에는 image를 어떻게 분류를 했을까?
딥러닝 이전의 머신러닝을 활용한 이미지 분류순서는 먼저 이미지의 특징(Feature Extractor)을 잡아내는 것 부터 시작된다. 특징을 찾는 방법으로는 HOG, SIFT, FAST, SURF, BRIEF... 등등이 활용되어 졌다. 이미지의 특징을 찾은 후에 분류(Classification)를 진행했다. 분류에 사용된 방식으로는 의사결정나무 랜덤 포래스트, 서포트백터머신, K 근접이웃, 가오시안 네이브 베이즈 등등 이 활용되었으며, 서포트벡터 머신이 딥러닝 이전의 이미지 분석으로 가장 많이 활용되었다. 이러한 방식을 사람이 알고리즘을 작성해서 진행했기 때문에 굉장히 많은 시간들이 걸렸다고 할 수 있다.
위의 머신러닝과 딥러닝의 가장 큰 차이는, 머신러닝은 사람이 직접 판단을하여 모델을 만드는 것이고 딥러닝은 감으로 여러 심경망을 대충 넣어보고 결과값을 판단한다는 점이다. 감으로 layer들을 쌓아서 계산을 해보니 머신러닝 시절보다 빠르게 학습을 시킬 수 있고, 정확도도 높게 나오기 때문에 딥러닝을 사용하는 것이다. 딥러닝은 자체적으로 역전파 방식(Gradient Backpropagarion)을 활용하여 계산시스템(weight, bias)이 업데이트되기 때문에 좀 더 쉽게 모델을 만들수 있다. 이러한 점들을 인지하고 CNN을 공부해야한다.
CNN은 특정 모델을 한정하는 것이 아니다. Convolution layer와 Pooling layer의 조합으로 만들어진 모델을 통틀어 CNN 모델이라고 할 수 있다. 즉, 블랙박스 모델인(결과값을 설명할 수 없음) layers들을 Conv와 Pooling의 조합을 이것저것 만들어 보면서 최적을 결과 값이 나올때, 이름을 붙여 발표를 한다고 할 수 있다. 예를 들면 아래와 같다.
- LeNet-5 1998
- AlexNet - 2012
- VGG - 2014
- Network in Network - 2014
- ResNets
- inception-v3
- GAN
따라서 위의 모델들은 모두 CNN 모델이라고 할 수 있다. 왜냐하면 Convolution layer와 Pooling layer의 조합으로 만들어진 모델들이기 때문이다. 정리하자면, 최신 모델들을 이해하려면 기본적으로 CNN모델을 알아야 한다.
추가적으로 CNN에서 사용되는 Convolution layer와 Pooling layer를 집중해서 이해하길 바란다.
0. CNN 특징
> 신경망은 layer들의 연결로 이루어 진다. 따라서 아래의 그림을 보면 Convolution layer와 Pooling layer들이 연결이 되어 있는 것을 알 수 있다. 그렇다고 Convolution layer와 Pooling layer으로만 CNN이 구성되어지지 않는다. CNN은 크게 2가지로 나눠진다. 하나는 특징을 추출하는 feature extraction로 이루어져 있고, 다른 하나는 feature extraction를 통과한 이후에 결과값을 도출해 주는 Classification으로 이루어져있다. 이때 Convolution layer와 Pooling layer가 섞여 있는것이 feature extraction이고, fully-connected layer로 이루어 진것이 Classification이다.
- image classification(이미지 분류-지도학습)에서 가장 많이 사용하고 있다.
- 일반적으로 convolution layer, pooling layer, fully-connected layer로 구성되어 있다.
- feature extraction 역할(특징을 뽑아낸다) - Convolution, Pooling layer
- classification 역할(물체를 판단한다) - Fully-connected layer
1. Convolution Layer
> Convolution Layer의 기본 특징은 이미지의 특징을 판단하는 것에 있다. 컴퓨터는 image에서 물체를 판별 할 때, 다른 위치에 있는 같은 물체를 다른 물체라고 판단한다. 이러한 문제를 해결해주는 것이 Convolution layer이다. image 크기보다 작은 filter를 사용하여, filter 로 특징을 판별한다는 점을 인지하고 아래의 글을 보자.
보통 이미지를 입력으로 많이 받는다. 따라서 아래의 예는 32픽셀x32픽셀 이미지기 때문에 2D Convolution Layer를 사용한다.
위의 이미지는 32x32x3 image이다. 여기서 channel은 RGB로 받기 때문에 3개인 것이고, 만약 흑백이면 channel은 3이 아니라 1이 될 것이다. 차원변경 방법은 여기를 누르자
위의 예에서 필터 같은 경우에는 현재 5x5x3 filter인데, 부를 때는 5x5 필터라고 부르지만 실제 들어있는 개수는 25개가 아니고 75개이다. 왜냐하면 계산을 위해 앞의 이미지 channal에서 받아오는 것이기 때문에 항상 image와 filter의 3은 같은 숫자여야한다.
계산은 쉽게 말해서 위의 filter를 image의 왼쪽 위에 가져다 댄 후에 곱한다고 생각한다(숫자하나가 나온다.). 그리고 한칸식 이동하여 곱하여 합하여 값을 도출한다. 이때 곱하는 것은 내적(dot product)이다. 한칸식 이동하여 생긴 결과 값은 아래와 같다.
이러한 결과값을 Feature map이나 Activation map이라고두 부른다. 이떄 특징을 여러개 뽑기 위해서 filter를 하나만 쓰지 않고 여러개를 쓰인다. 좀 더 쉽게 이야기를 하면, 첫번쩨 필터는 사진에서 네모를 찾는 filter이고 두번째 filter는 특정 삼각형을 찾는 filter라고 지정하여 filter 하나당 하나의 특징을 찾는다고 생각하면 된다.
만약 6개의 filter를 썼다면 6장의 Feature map이 생성된다. 그렇다면 channal이 6이 되는거다. output feature map의 채널 수는 convolution filter의 수와 같다.
2. Convolution 연산과정(2D convolution layer computation)
위의 그림에서 kernel이 filter라고 보면 된다. 그리고 input이 input feature map이고 output이 oup feature map이라고 보면된다.
input의 채널이 필터의 채널과 같고, 필터의 갯수가 output 채널과 같다.
input channel에서 빨 녹 파 순서로 R, G, B라고 보면 된다.
이때 우리는 미니배치를 하기 떄문에 이미지를 하나만 하는것이아니라 여러개를 학습하기 때문에 input feature map이 여러개가 되고, 따라서 실제는 3차원이 아니라 4차원이라고 할 수 있다. 여기서 2D convolution later라고 한 이유는 연산시 상하좌우로만 이동하여 연산하기 때문에 2D라고 이름 지어 진것이다. 실제 사용되는 형태는 4D Tensors로 사용되고 tensorflow에서도 4차원으로 입력을 줘야한다. Tensor 변경법은 여기를 눌러 확인하자
3. 연산의 옵션(Options of Convolution)
convolution 연산을 할 때 사용되는 여러 옵션에 대해 알아보자.
3.1 Stride
보통은 연산 시 한칸씩 이동하여 계산을 한다. 하지만 한칸이 아니라 여러칸씩 이동이 가능하다. 아래의 그림은 한번에 convolution이 후에 2칸을 이동하는 것을 표현한 것이다. 이렇게 가로세로 몇칸씩 이동하는지를 나타내는 설정의 이름이 Stride라고 한다.
즉, 다음 convolution연산을 위해 몇칸을 옆이나 아래로 이동하는지에 대한 이야기다. 위의 경우는 (7, 7) 이미지가 2칸씩 stride 한 결과값은 (3, 3)이 된다.
3.2 Zero Padding
만약 stride가 1인을 적용한 32x32 image를 convolution 연산을 5x5인 filter로 연산을 하면 28x28 결과값이 나온다. 즉, 크기가 줄어들게 된다. 이렇게 되면 layer를 깊게 쌓다 보면 크기가 너무 줄어들어 정확한 정확한 연산이 어렵게 된다. 그런걸 방지하기 위해 주위에 0으로 패딩을 할 수 있다.
- filter가 3x3 인 경우는 주위에 1줄을 패딩을 하면 size가 유지된다.
- filter가 5x5 인 경우는 주위에 2줄을 패딩을 하면 size가 유지된다.
- filter가 7x7 인 경우는 주위에 3줄을 패딩을 하면 size가 유지된다.
4. Activation Function(활성화 함수)
딥러닝 네트워크에서는 노드에 들어오는 값들에 대해 곧바로 다음 레이어로 전달하지 않고 주로 비선형 함수를 통과시킨 후 전달한다. 이때 사용하는 함수를 활성화 함수(Activation Function) 이라 부른다. 좀 더 자세한 설명은 여기를 참고하자.
convolution연산을 한 후에 위의 이유로 activation function을 통과 한다. 이 때 가장 많이 쓰는 함수가 ReLU이다. ReLU 함수는 음수는 0으로 통과를 시키고 양수는 그대로 통과 시켜준다.
코드 작성은 다음 CNN으로 작성하겠다.
5. Pooling layer
> Pooling layer의 목적은 특징을 강화하는데 있다. 사용법은 위의 convolution layer랑 비슷하지만, 값들 중 특정값만 유지하고 나머지 값은 버린다고 생각하면 된다. Pooling layer의 종류에는 max pooling, average pooling, overlapping Pooling이 있다. 간단히 알아보고 실습을 통해 배워보자.
-
max polling (대부분 max pooling을 사용한다.)
-
계산양이 감소하기 때문에 연산부하가 줄어든다.
-
size를 줄이는 것이기 때문에 필연적으로 오차가 발생하므로 오버피팅을 약간 줄여준다.
-
back propagation 시 복원이 힘들다. 따라서 너무 많이 넣으면 안된다.
-
-
average pooling (거의 안씀)
-
시그모이드는 다 1이하기 때문에 상관 없다
-
tanh는 시그모이드 보다는 괜춘하지만, 그래도 -1~1 사이기 떄문에 상관 없다. 이 때 문제는 다이밍 풀에 걸리면 유실되는 정보가 많아진다. 0, 0, 0, 1을 평균내면 0.25가 나오기 때문에 소멸될 수 있다. 0,0,0,1 같은 경우는 1에 특징값을 강조해야하는데 평균을 내면 특징값을 강조할 수 없다.
-
Relu쓰면 0이 만아지기 때문에 average pooling을 안쓰는게 좋다.
-
물론 경우에 따라 평균 풀링이 좋은 경우가 있기는 하다.
-
-
Overlapping Pooling
-
겹쳐서 풀링하는 것인데, 논문에서만 나오는 것이고 그런게 있구나 정도로만 생각하자.
-
CNN 구현법을 여러가지로 다양하게 만들고 있는중이다.
'인공지능(Artificial Intelligence) > CNN' 카테고리의 다른 글
tensorflow_CNN의 기본연산 Pooling 구현하기_tf.keras.layers.MaxPool2D (0) | 2020.10.13 |
---|---|
tensorflow_tf.keras.layer.Conv2D, CNN 기초 코딩해보기 (0) | 2020.10.13 |
tensorflow_VGG16 코드(이미지 분류) (2) | 2020.09.28 |
- Total
- Today
- Yesterday
- 클라우데라
- NextJS
- nodejs
- BFS
- 자연어처리
- error:0308010C:digital envelope routines::unsupported
- useState
- Vue
- django
- Express
- Queue
- nextjs autoFocus
- UserCreationForm
- JavaScript
- react
- react autoFocus
- Python
- logout
- DFS
- next.config.js
- useHistory 안됨
- login
- typescript
- TensorFlow
- Deque
- mongoDB
- vuejs
- pandas
- 자료구조
- read_csv
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |