- 사실(Fact): 딥러닝 CNN(합성곱 신경망) 예제(The CIFAR-10 dataset) 학습
- 느낌(Feeling): cnn explainer 홈페이지를 통해 시각적으로 확인할 수 있어서 이해도가 높아졌다. 개념이 확실하진 않지만 앞으로 실습해가면 조금 더 알 수 있을 거 같다.
- 교훈(Finding): 조금 더 성실하게 정리해보자
멋사 AI스쿨 7기 박조은 강사님
오늘 수업의 핵심: 합성곱 층을 만드는 것
CNN의 합성곱(Convolution)을 구성하는 핵심요소
필터(Filter) & 활성화함수(Activation Function)
레이어 미리보기
model = models.Sequential()
model.add(layers.Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
# train_images의 첫번째 이미지: train_images[0]
# (image_height, image_width, color_channels)
# image_height, image_width,는 그대로 가져오고
# color_channels 은 0, 1, 2 번째 값을 가져올 수 있습니다.
# [:, :, 0] color_channels 의 0번째 채널 Red, 1 Green, 2 Blue
train_images[0].shape
train_images[0][:,:,0].shape
(32, 32, 3)
(32, 32)
CNN의 과정 참고하기 좋은 사이트
https://poloclub.github.io/cnn-explainer/
위의 커피 이미지에서 kernel사이즈는 3*3
컨볼루션 레이어를 통과한 결과 10개의 피처 : 피처 맵
피처맵이 relu 활성화 함수를 통과한 것 엑티베이션맵
Convolution 연산
필터(filters, kernel_size에 해당하는 filters 개수만큼)를 통과시켜서 filters 개수만큼 피처맵을 생성한다.
피처맵은 피처가 어떤 특징을 갖고 있는지를 나타냅니다. 다양한 모양을 랜덤하게 생성해서 통과 시키면 해당 특징이 있는지를 학습하게 하는게 Convolution 연산이다.
필터는 이미지에서 특징을 분리해 내는 기능으로, 필터를 이미지에 통과해서 입력 데이터를 지정된 간격으로 순회하며 채널별로 합성곱 연산을 하는데, 이 합성곱에 사용되는 커널의 크기를 kernel_size라고 한다.
피처맵 Output에 Activation Function(활성화함수)을 통과시켜서 액티베이션맵을 생성한다.
=> relu 등을 사용하게 되면 출력값에 활성화 함수를 적용한 액티베이션맵을 반환한다.
풀링(Pooling)
이미지 크기를 줄여 계산을 효율적으로 하고 데이터를 압축하는 효과가 있기 때문에 오버피팅을 방지해 주기도 한다.
이미지를 추상화 해주기 때문에 너무 자세히 학습하지 않도록해서 오버피팅이 방지되게 된다.
- MaxPooling: 가장 큰 값을 반환 (주로 사용)
- AveragePooling: 평균 값 반환
- MinPooling: 최솟값 반환 (흑백이미지에서 사용하기도함)
VGG16, VGG19 등은 층을 16개, 19개 만큼 깊게 만든 것을 의미한다.
층의 수를 모델의 이름에 붙이기도 한다.
Padding, Stride 등을 사용해서 입력과 출력사이즈를 조정하고,
Stride로 필터의 이동 보폭을 조정합니다. (스트라이드(stride)1로 지정한다면 필터를 한 번에 한 픽셀씩 이동한다.
stride를 높일 수록 공간적으로 더 작은 출력 볼륨이 생성되므로 데이터 손실을 고려해야한다.)
padding="same” 패딩의 효과 가장자리 모서리 부분의 특징을 더 학습할 수 있다
DNN을 이미지 데이터에 사용했을 때 단점?
- flatten() 으로 1차원 벡터 형태로 주입을 해야 하기 때문에 인접 공간에 대한 정보를 잃어버리게 된다.
- 1차원 형태로 주입을 해주게 되면 입력값이 커서 계산이 오래 걸린다.
CNN의 특징
1. Conv과 Pooling 연산을 하게 되면 데이터의 공간적인 특징을 학습하여 어떤 패턴이 있는지를 알게 된다.
2. Pooling 을 통해 데이터를 압축하면 데이터의 용량이 줄어들며, 추상화를 하기 때문에 너무 자세히 학습하지 않게 된다.
(오버피팅 방지)