1. CNN 개요
- Image는 2차원 데이터고, 2차원 데이터를 1차원 벡터로 평활화하여 신경망 모델에 학습시켜야 한다.
- CNN의 특징은 Image Size를 줄이면서, 특징을 나타내는 이미지들을 추출 해낼 수 있다.
- FC Layer에 도달하기 전까지 평활화 과정 없이 이미지 정보를 효과적으로 유지하며, 특징 픽셀들을 추출한다.
위 과정에서 인접한 픽셀과의 관계를 효과적으로 인식 할 수 있고, 이미지의 특징을 모으거나 강화할 수 있다
CNN 주요 개념
- 정사각형 행렬 모양의 Filter가 이미지를 순회하며 Convolution을 계산한다.
- 계산 결과를 이용하여 Feature map을 만든다.
- Feature map을 모아 한 이미지에서 활성화된 픽셀만을 모은 Activation map을 만든다.
- 위 3가지 과정을 Convolution Layer라고 한다.
- Convolution layer의 shape는 Filter 크기, Stride, Padding 등에 영향을 받는다.
- 출력된 Convolution layer를 또 하나의 입력 데이터로 삼아, Pooling 과정을 거친다.
- 위 두 과정을 반복하면 이미지의 크기는 줄어들고, 채널이 늘어난다.
이미지 데이터에 대한 이해
- 우리가 눈으로 보는 컬러 이미지는 RGB 공간에 저장된다. (RED, GREEN, BLUE)
- 흑백 이미지라면, 이미지는 RGB 공간이 아닌, Gray scale 공간에 저장된다.
- Pixel 값은 흰색의 강도를 나타낸다.
- 작을수록 검은색에 가깝고, 클수록 흰색에 가까움
- 이미지가 어떤 색 공간에 저장되는지에 따라 이미지의 depth가 달라진다.
- RGB 공간의 경우 이미지 depth는 " 3 "
- Gray scale 공간의 경우 " 1 "
- 이미지를 하나의 depth 별로 쪼개어 나타냈을때 각 한장의 이미지를 채널이라고 함.
입력 데이터
- CNN 신경망에 입력되는 데이터는 (Height, Width, Channel) 형태의 이미지다.
- 만약 CNN 신경망에 이미지 1장이 입력된다고 가정하면, 28 x 28 픽셀의 컬러 이미지라면,
해당 입력 데이터의 shape는 (28, 28, 3) 이고, 흑백 이미지라면 (28, 28, 1)이 된다.
Convolution Layer
1. Filter ( = Kernel)
- 이미지의 특징을 뽑아낼 거름망 역할을 수행한다.
- 2차원 정사각 행렬 형태이다.
- 자신의 크기 만큼 이미지를 확대하고, 해당하는 부분만 확인한다.
- 해당하는 영역의 값들을 하나의 값으로 뽑아내기 위해, 합성곱 연산 수행한다.
- Neural Network에서 Weight(가중치)라고 판단하면 된다.
- 처음에는 임의의 값을 부여한 뒤, 학습을 통해 적절한 filter 값을 찾음
2. Channel
- Convolution을 구성하는 레이어의 수를 의미한다.
- 처음에는 이미지의 depth (color, gray 여부) 이지만, 이후에는 필터의 개수가 된다.
- 이미지는 입력층을 지나 Convolution Layer를 지날 때 마다 값이 달라진다.
3. Convolution (합성곱)
- Gray Scale의 픽셀값으로 나타내면 아래와 같다.
- Filter를 가지고 합성곱 연산을 아래와 같이 수행해본다.
4. Stride (보폭)
- Filter가 Convolution 연산을 수행하기 위해 이동하는 양.
- Filter가 지정된 Stride만큼 오른쪽으로, 위에서 아래로 이동한다.
5. Feature map
- 필터 설정한다.
- 같은 값을 갖는 필터를 이용하여 입력된 이미지 데이터 탐색한다.
- 필터가 계산하는 합성곱 연산 결과를 2차원 행렬에 저장한다.
- 위 합성곱을 수행하면, 필터 가중치에 해당하는 이미지 특징들이 추출된다.
- 아래와 같이 “ 5 “ 를 나타내는 이미지에서 맨 위 가로 부분을 뽑아서 인식하고 싶다면
가로로 배열되어 있는 성분을 강조하는 3 x 3 크기의 필터를 적용할 수 있다. - 숫자가 없는 부분의 픽셀 값은 모두 0이라 하여,
Convolution을 수행하면 오른쪽과 같이 기존 이미지에 비해 가로 성분이 강조된 Featured map이 출력된다. - Feature map에서 한변의 길이가 중요하다. ⇒ 한변의 길이가 정수가 되도록 Stride를 설정하는 것이 중요함.
- 5 x 5 이미지, 3 x 3 필터, 1 보폭 : Feature Map 사이즈 3 x 3
- 5 x 5 이미지, 3 x 3 필터, 2 보폭 : Feature Map 사이즈 2 x 2
5. Padding
- 위와 같이 필터를 적용해서 작업을 계속 하면, 이미지 사이즈가 작아지게 된다.
- 이미지 사이즈가 작아지면 데이터 손실이 발생한다.
- 이를 방지하기 위해 이미지 레이어 외부에 일정한 값의 레이어를 덧덴다.
⇒ 일반적으로 상하좌우 같은 크기의 값을 갖는 0을 덧대는 패딩을 사용함.
- 패딩 효과
- Convolution Layer 출력 데이터 크기가 과도하게 축소되는걸 방지한다.
- Neural Network가 이미지 외곽을 인지할 수 있다.
Activation Map
- Feature map 각 픽셀에 대해 활성화 함수를 적용한 결과
- Convolution Layer 최종 출력 결과
- 일반적으로 ReLU 함수 사용
Pooling Layer
- Convolution Layer 출력인 Activation Map의 크기를 줄이는 과정
- Activation Map에 인접한 부분에서 일정한 기준에 따라 픽셀 하나의 값을 뽑는다
- 일정한 크기의 커널을 두고 Activation map을 슬라이딩 하며 가장 큰 값(Max Pooling)혹은
가장 작은 값(Min Pooling) 혹은 평균값(Average Pooling)을 뽑는다 - Pooling 커널이 슬라이딩하는 것은 [Filter ( = Kernel)]가 움직이는 것과 같은 원리이므로, 해당 커널 역시 Stride가 있다.
- Kernel size : 2 x 2 , Stride : 2 일 때 Pooling 종류에 따라 Activation Map 변화
- 커널 영역에서 상관성이 가장 높다고 판단하여 MAX POOLING을 제일 많이 사용
- 단점 : 데이터 손실
- 장점 : 연산량, 메모리 사용 ↓, 과적합 (Overfitting) 방지 및 데이터 특정 부분이 변형되어도 동일한 결과 출력
Fully Connected Layer
- 위와 같은 과정이 반복되면 기존 이미지는 추상화되어 특징들만 남게 된다.
- 이런 결과를 평탄화(flatten)하여, 1차원 벡터로 Fully Connected Layer에 전달한다.
Fully Connected Layer가 하는일
- 활성화 함수를 적용하여 원하는 작업을 수행한 뒤, 최종 결과 추출
- Optimizer는 Convolution Layer와 Fully Connected Layer의 가중치에 오류들을 역전파하며 각 가중치들을 조정해 나간다.
Model Architecture
- 3차원 이미지로 R,G,B 채널로 구성
- 4 x 4 필터 적용 depth : 3 (RGB 공간에 존재) ⇒ shape (4, 4, 3)
- 필터는 12개의 값으로 구성된 육면체이다.
- 이 상태에서 합성곱 연산을 하기 때문에 12개의 값을 모두 더한것이 Feture map 한칸에 저장됨.
- Stride 값은 2 이고, 패딩을 적용 안하면 Feature map 한 변의 길이는 9 가 된다.
- 이제 이미지에 각각 다른 필터 6개를 적용한다고 하자. 6개의 서로 다른 특징들을 추출하겠다는 의미다.
- 예컨대 하나의 필터는 고양이의 귀를, 하나는 고양이의 눈을, 또 다른 하나는 고양이 수염을 인식하는 방식이다.
- 서로 다른 부분을 추출하므로 각각의 필터가 가지고 있는 가중치는 모두 다르다.
- 그렇다면 6개의 필터를 활용해 Convolution을 적용한 결과로 모두 9x9짜리의 Feature Map 6개를 결과로 얻게 된다.
- 각각의 Feature Map에 ReLU 활성화 함수를 적용하여 Activation Map을 만든다.
- 따라서 Convolution Layer에서 얻게 되는 데이터의 shape은 (9, 9, 6)이 된다.
- 위의 과정을 통해 Convolution 출력 레이어의 최종 결과의 채널은 필터의 개수와 같아 진다는 것을 알 수 있다.
- 특히 위에서 말했듯 필터가 추출하고 싶은 이미지 특징을 나타낸다는 점을 고려한다면, 추출하고 싶은 특징의 수를 설정한 뒤,
이것을 모두 필터로 설정해 버리면 된다. - 그 결과, Convolution Layer의 채널 수로 추출하고자 하는 특성의 수 만큼을 가지게 된다.
- 위의 Activation Map에 커널 사이즈를 3 x 3, stride를 2로 하여 Max Pooling을 적용하자.
- 그러면 각각의 Activation Map이 3 x 3 사이즈로 축소된다.
- 이렇게 모든 Convolution과 Pooling의 과정을 거친 후, 모든 데이터를 평활화한다.
- 그러면 (3, 3, 6) shape의 데이터가 (54, ) shape의 1차원 벡터가 된다.
- 이 벡터를 Fully Connected Layer에 주입하고, 활성화 함수로 Sigmoid 함수를 사용하여 이진 분류 문제를 풀면 되는 것이다.
- 한 장의 이미지를 주입할 때 CNN 모델의 아키텍쳐는 위와 같다.
- 이제 위와 같은 이미지가 여러 장 있다면, 데이터의 shape이 4차원이 될 것이다.
- 기존의 3차원 구조에 이미지의 개수가 한 차원으로 더 추가되는 것이다. 다음 실습에서 살펴 볼 Tensorflow에서는
이미지 데이터를 (입력 이미지 개수, 이미지 높이, 이미지 너비, 채널 수), 즉, (Num, Height, Width, Channels)로 표현한다. - 차원이 한 차원 더 더해지는 것일 뿐, 뒤의 과정은 동일하다.
- 이렇게 여러 장의 이미지에 Convolution과 Pooling을 여러 번 적용하고(여러 층을 만든다는 의미이다.),
학습을 통해 특징을 추출해낸 뒤 Fully Connected Layer에 주입하여 원하는 작업을 수행하는 것이 CNN 알고리즘의 원리이다.
'딥러닝 > Notions' 카테고리의 다른 글
Activation Function : Step/Linear Function (0) | 2022.12.27 |
---|---|
Perceptron (0) | 2022.12.27 |
Quantization (0) | 2022.12.26 |