CNN - 합성곱 신경망(Convolutional Neural Network)
- DCNN (Deep Convolutional Neural Network)
Overview
- 컴퓨터 비전(이미지, 동영상관련 처리) 에서 사용되는 딥러닝 모델
- 특히 이미지 분류에 가장 많이 사용된다.
- 일반적으로 Convolution layer, Pooling Layer, Fully-connected layer 로 구성되어 있다.
- Convolution layer와 pooling layer: Feature Extraction 담당
- Fully-connected layer : 분류 담당
CNN 응용
-
이미지 분류
- 64*64 이미지를 입력하였을 때 고양이인지 여부 판단
2. Object detection(객체 찾기)
- 이미지 안의 물체를 탐색하여 자동차에 네모 박스
- 찾는 항목을 찾아 표시해주는 것.
- ex) 자동차 번호판 인식
3. 이미지를 새로운 스타일로 변환
- 입력 이미지와 스타일 이미지를 합쳐 새로운 이미지 생성
- 이미지 스타일 변경해주는 것.
- ex) 사진을 피카소 그림스타일로 변경.
CNN 구성
- 이미지로 부터 부분적 특성을 추출하는 Feature Extraction 부분과 분류를 위한 Classification 부분으로 나뉜다.
- Feature Exctraction : Convolution Layer
- Classification : Dense Layer (Fully connected layer)
Dense Layer를 이용한 이미지 처리의 문제점
- 이미지를 input으로 사용하면 dimension(차원)이 매우 큼
- 64 * 64 픽셀 이미지의 경우
- 흑백은 Unit(노드)당 64 * 64 = 4096 개 학습 파라미터(가중치-weight)
- 컬러는 Unit(노드)당 64 * 64 * 3 (RGB 3가지) = 12288 학습 파라미터(가중치-weight)
- Hidden unit의 수에 따라 weight의 수가 지나치게 커지기 때문에 메모리 부족과 많은 계산 필요
- Fully connected layer(dense layer)만을 사용한다면 이미지의 공간적 구조 학습이 어려움
합성곱 연산 이란
- Convolution Layer는 이미지와 필터간의 합성곱 연산을 통해 이미지의 특징을 추출해 낸다.
이미지와 합성곱
-
필터(커널) : 이미지에서 특성(패턴)을 추출
- 대상 이미지
-
필터(커널)
필터와 부분 이미지의 합성곱 결과가 값이 나온다는 것은 그 부분 이미지에 필터가 표현하는 이미지특성이 존재한다는 것이다.
검증된 필터 적용의 예
- Sobel 필터
- X-Direction Kernel: 이미지에서 수평 윤곽선(edge)를 찾는다.
- Y-Direction Kernel: 이미지에서 수직 윤곽선(edge)를 찾는다.
CNN에서 Filter
- CNN의 Layer는 이런 Filter(Kernel)들로 구성되 있다.
- CNN은 주어진 Filter(Kernel)를 사용하는 것이 아니라 Filter(Kernel)의 값을 가중치(파라미터로)로 데이터를 학습해 찾아낸다.
CNN도 레이어를 쌓는다.
- 첫번째 레이어는 부분적 특징을 찾는다.
- 다음 단계에서는 이전 레이어에서 찾아낸 부분적 특징들을 합쳐 점점 추상적 개념을 잡아낸다.
Convolutional operation의 작동방식
-
hyper parameter 정의
- Filter의 크기: 일반적으로 3 * 3, 5 * 5 크기의 filter를 주로 사용 (보통 홀수 사이즈로 잡는다.)
- Filter의 수: Feature map output의 깊이
Featuer Map
- Filter를 거쳐 나온 결과물
-
흑백 이미지는 하나의 행렬로 구성
-
컬러 이미지는 RGB의 각 이미지로 구성되어 3개의 행렬로 구성
- 예)
- Input image는 6 X 6 X 3 형태 (높이, 너비, 채널)
- Filter: 3 X 3 X 3$ 크기 1개 (높이, 너비, 채널)
- Output: 4 X 4 feature map 1개 생성
- 예)
- Input image는 6 X 6 X 3 형태의 volume
- Filter: 3 X 3 X 3 크기 2개
- Output: 4 X 4 feature map 2개 생성
Padding
- 이미지 가장자리의 픽셀은 convolution 계산에 상대적으로 적게 반영
- 이미지 가장자리를 0으로 둘러싸서 가장자리 픽셀에 대한 반영 횟수를 늘림
- "valid" padding
- Padding을 적용하지 않음
- "same" padding
- Input과 output의 이미지 크기가 동일하게 되도록 padding 수를 결정
Strides
- Filter(Kernel)이 한번 Convolution 연산을 수행한 후 옆 혹은 아래로 얼마나 이동할 것인가.
- Stride=2: 한 번에 두 칸씩 이동 (feature map의 너비와 높이가 2배수로 다운샘플링 되었음을 의미)
Max Pooling Layer(최대풀링)
- 해당 영역의 input 중 가장 큰 값을 출력
- 일반적으로 2*2 크기의 window, stride=2 사용 (겹치지 않게 한다.)
- 강제적인 subsampling 효과
- weight 수를 줄여 계산속도를 높임
- 특징의 공간적 계층구조를 학습한다. => 부분적 특징을 묶어 전체적인 특징의 정보를 표현하게 된다.
- 학습할 weight가 없음: 일반적으로 convolutional layer+pooling layer를 하나의 레이어로 취급
Fully-connected layer
- Feature Extraction layer들을 거처 나온 output에 대해 분류는 fully-connected layer 에서 처리한다.
- output을 flatten 한 뒤에 처리한다.
Example of CNN architecture
- 일반적으로 convolutional layer (+ ReLU or other activations) + pooling layer를 여러 개 쌓음
- Network가 진행될 수록 feature map의 크기는 줄어들고 깊이(개수)는 증가
- 마지막에 Fully connected layer(+ ReLU or other activations) 추가
- Output 형태에 맞는 output layer
CNN structure with Keras
-
Input shape: (image_height, image_width, image_channels)
-
Convolution레이어: tensorflow.keras.layers.Conv2D(filters, kernel_size, strides=(1, 1), padding='valid', activation=None)
filters
: the dimensionality of the output space (i.e. the number of output filters)kernel_size
: height and width of the 2D convolution windowstrides
: the strides of the convolution along the height and widthpadding
: "valid" or "same"activation
: activation function https://keras.io/activations/
-
MaxPooling레이어:tensorflow.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=None, padding='valid')
pool_size
: Pooling window sizestrides
: default =pool_size
-
tensorflow.keras.layers.Flatten()
- Flattens the input
- Fully connected layer를 적용하기 위함
728x90
반응형
'Data Analysis & ML > Deep Learning' 카테고리의 다른 글
[Deep Learning][딥러닝] CNN MNIST 분류 (0) | 2021.01.24 |
---|---|
[Deep Learning][딥러닝] CNN_MNIST분류 / 모델저장/ FunctionalAPI (0) | 2020.11.09 |
[Deep Learning][딥러닝] DNN 성능개선 (0) | 2020.11.09 |
[Deep Learning] DNN 분류 (DNN Classification) (0) | 2020.09.23 |
[Deep Learning] DNN 회귀분석 (Tensorflow Dataset) (0) | 2020.09.23 |