Fully-connected Layer와 이미지 데이터
FC Layer는 1차원 데이터를 요구
• 이미지를 단순하게 1차원으로 바꾸면 2차원 상에서 가지는 정보를 포기해야 함
- 이미지 내 사물 간의 거리 관계 등
- 색의 변화 → 특히 세로로 변하는 상황
• 즉, 공간 정보(Spatial Information)가 무너짐
• 따라서 이미지 처리에 특화된 딥러닝 모델이 등장
• CNN의 대표적인 구성 요소
- Convolutional Layer
- Pooling Layer
- 분류기(Classifier): Fully-connected layer로 구성
Convolution 연산
CNN을 구현하는 핵심 연산
• 커널과 Convolution 연산
- 전통적인 이미지 처리 분야에서 커널(또는 필터)이란 것이 존재
- 이미지와 커널 간의 Convolution 연산으로 처리
• 2차원 이미지 데이터: 행렬로 표현 가능
- 행렬의 각 원소는 해당 위치의 이미지 픽셀값
• Convolution 커널: 행렬로 표현 가능
• Convolution 연산은 2차원 상에서 연산이 이루어지므로 이미지 데이터를 변형 없이 그대로 사용 가능
연산 과정: 커널이 이미지의 노란색 영역에 겹쳐짐
•
•
•
•
• 연산 결과: Feature Map 또는 Activation Map이라 부름
• 커널과 이미지가 겹치는 영역: 수용 영역(Receptive Field)
컬러 이미지의 Convolution 연산
•앞선 예시는 이미지의 채널이 1개 → 흑백 이미지
• 컬러 이미지는 채널이 3개
• 이 경우 커널도 채널을 3개로 준비
각 채널 별로 Convolution 연산을 수행하고 각 결과를 더해서 하나의 Feature Map을 생성
Convolution 연산 확장
• 지금까지는 커널을 한 개만 사용 → Feature Map도 한 개
• 커널을 여러 개 두면 Feature Map도 여러 개 생성
Convolutional Layer
• 지금까지 사용한 커널들은 학습 가능한 커널
- 즉 커널 행렬의 각 값들이 가중치(Weight)
• 이러한 커널들로 이루어진 Layer를 Convolutional Layer라고 부름
- 이 Layer들을 쌓아서 CNN을 구성
Layer 역할
• 이미지가 가지는 특정 Feature를 뽑아내도록 커널을 학습
• 커널에 따라 추출하는 Feature를 다르게 학습
• 이미지 내의 대각선, 원형, 색조 등등이 이러한 Feature에 해당
Stride
• Convolution 연산 과정을 조절하기 위한 Hyperparameter
• 커널이 이미지 내에서 이동하는 칸수를 조절
• 지금까지 Convolution 연산에서 보여준 예시는 모두 1칸
• 위의 그림은 Stride가 2칸일 경우의 예시
Padding
• 지금까지 예시는 Convolution 연산 결과 Feature Map 사이즈가 계속 줄어듦
• Padding을 추가하여 Feature Map 사이즈가 줄어드는 현상 방지
• 또한 이미지의 테두리 정보도 균일하게 활용
Convolutional Layer 의의
• 왜 이미지 특징을 잘 뽑아내는가?
• Convolution 연산은 하나의 커널이 픽셀 간의 정보를 보게 만듦
• 하나의 커널이 이미지 전체 영역을 보고 학습
Parameter Sharing
• 커널이 가진 Parameter를 이미지의 모든 영역에서 공유
• Parameter 개수를 FC Layer에 비해 극적으로 줄임 → 과적합 방지에 유리
Convolutional Layer 활성화 함수
• Convolution 연산 또한 선형 연산
• 모두 곱셈과 덧셈으로만 이루어짐
• 따라서 FC Layer처럼 비선형성을 추가하기 위해 활성화 함수를 사용
• CNN은 주로 ReLU 함수 사용
Pooling Layer
• CNN에서 거의 항상 같이 쓰이는 Layer
• 주 역할: Feature Map의 사이즈를 줄여서 Parameter 개수를 줄이는 것 → 과적합 조절
Pooling Layer – Max Pooling
• 주어진 이미지나 Feature Map을 겹치지 않는 영역으로 분할
• 위 그림은 각 영역의 크기가 2x2가 되도록 분할
• 각 영역에서 최대값을 뽑아내어 새로운 Feature Map을 구성
Pooling Layer – Average Pooling
Max Pooling과 거의 동일하나, 각 영역의 평균값을 계산하여 새로운 Feature Map을 구성
Pooling Layer
• 일반적으로 Max Pooling을 많이 사용
• Feature Map에 존재하는 Feature 중 가장 영향력이 큰 Feature만 사용
• Feature Map의 채널이 여러 개면 각 채널별로 Pooling 연산 수행
• 추가 Pooling Layer
• Global Average Pooling: 전체 Feature Map에서 하나의 평균값을 계산
• Global Max Pooling: 전체 Feature Map에서 하나의 최대값을 계산
• 둘 다 마찬가지로 채널 별로 연산
• 여기선 Global Average Pooling을 많이 사용
분류기 (Classifier)
• CNN은 일반적으로 이미지 분류 목적으로 사용
• Feature Map을 Fully-connected Layer에 통과시켜 분류를 수행
• 이를 위해 Feature Map을 1차원으로 변형
LeNet (1990)
AlexNet (2012)
• 2012년 ImageNet Challenge 우승 → 기존 모델의 성능을 큰 폭으로 상회
• ReLU 활성화 함수 소개
• 딥러닝 모델 학습에 GPU를 활용 → 이후로 사실상 모든 딥러닝 모델은 GPU로 학습
VGGNet (2014)
• 커널 사이즈를 모두 3x3으로 통일
• Parameter 수 증가를 억제하면서 모델 층을 더 많이 쌓을 수 있게 됨
• 층이 많을수록(즉, 모델이 깊을수록) 일반적으로 성능이 향상됨
ResNet (2015)
• Layer 개수를 최대 152개까지 늘림
• 깊은 모델에서 필연적으로 나타나는 현상: Vanishing Gradient • Vanishing Gradient (기울기 소실)
- 역전파 과정에서 기울기 값이 점점 작아지다 0에 수렴하면서 발생
- 모델 학습에 오랜 시간이 걸리거나 아예 학습이 멈추게 됨
Residual Connection
• Vanishing Gradient 문제를 해결하기 위한 구조
• 이를 통해 Layer 개수를 극적으로 늘림
• 기존 Convolutional Layer들을 우회하는 연결
- 입력 Feature Map이 우회로를 통과하여 Convolutional Layer의 Feature Map과 더해짐
- 기울기 값이 항상 1 이상이 되어 기울기 소실 문제를 방지
'파이썬 이것저것 > 파이썬 딥러닝 관련' 카테고리의 다른 글
[Python] 딥러닝 ResNet 구현하기 (0) | 2022.07.17 |
---|---|
[Python] 딥러닝 CNN(VGG16 모델 구현하기) (0) | 2022.07.17 |
[Python] Tensorflow 커스텀 데이터셋 불러오기 (0) | 2022.07.17 |
[Python] PIL 알아보기 (0) | 2022.07.17 |
[Python] 딥러닝 순환 신경망 (RNN) (0) | 2022.07.15 |