2019년 4월 27일에 있었던 한국게임학회 인공지능분과 두번째 모임에 진행했던 <Tensorflow 2.0 튜토리얼 - CNN> 강연자료입니다. CNN 을 처음 접하는 분들을 위해 CNN 의 기본 개념을 짚어보며, Google Colab Sample Code 를 통해 2.0 에서 CNN 을 사용하는 방법을 간단하게 살펴봅니다.
4. CNN
• State of The Art – ImageNet
• 1,400 만 장의 이미지를 올바른 카테고리로 분류하는 대회
• 2015 년에 ResNet 이 인간의 퍼포먼스를 뛰어넘음
• 2017 년 이후로 더 이상 대회가 열리지 않음
http://blog.a-stack.com/2018/07/06/ImageNet-DataSet/
https://alexisbcook.github.io/2017/using-transfer-learning-to-classify-images-with-keras/
에러율 (%)
7. Convolution
• 원본 이미지에 일정 크기의 필터를 합성(곱)해서 더한 값으로 새
로운 이미지를 생성
http://deeplearning.stanford.edu/wiki/index.php/Feature_extraction_using_convolution
8. Convolution
• 간단한 Convolution 필터와 결과 이미지
https://en.wikipedia.org/wiki/Kernel_(image_processing)
수직선 검출 수평선 검출
Box blur Sharpen
9. 전통적 Convolution
• 결과 이미지에서 Feature 를 얻을 수 있음
• 다양한 문제 – object detection, object recognition, denoising – 를 풀 수 있음
https://kr.mathworks.com/help/vision/ug/local-feature-detection-and-extraction.html
https://www.researchgate.net/figure/Sobel-operator-applied-to-the-image-Fig-22-Prewitt-operator-applied-to-image_fig15_221581664
BRISK - blob FAST - corner Sobel Filter - edge
10. Convolution
• 한계점 : Feature 의 사전 정의 필요
• 전문적 지식 필요
• 수행에 시간이 오래 걸림
• 다른 도메인에 일반화하기 힘듦
/zukun/eccv2010-feature-learning-for-image-classification-part-0
11. CNN
• Feature Extraction
• 학습 과정에서 네트워크가 Feature 를 자동 생성
https://opensource.googleblog.com/2018/03/the-building-blocks-of-interpretability.html
12. Feature Extraction
• Low-level : 모서리, 면
• Mid-level : 바퀴, 큰 부품
• High-level : 헤드라이트 램프, 작은 부품
https://technodocbox.com/3D_Graphics/72864833-Deep-learning-in-radiology-recent-advances-challenges-and-future-trends.html
15. 일반적인 CNN 의 구조
• Conv 와 Pool 이 교차되며 배치됨
• 오버피팅을 막기 위해 Dense 뒤에 Dropout 사용
Conv
Layer
Pool
Layer
Conv
Layer
Pool
Layer
Flat
Layer
Dense
Layer
Dropout
Layer
Dense
Layer
Cat : 0.99
Dog : 0.1
Input
Output
Feature Extractor
Classifier
16. Conv Layer
• Filter : 데이터의 feature 를 자동 추출하는 역할
• Filter 는 이미지의 모든 영역에 대해서 Convolution을 계산
• Filter 를 재사용하기 때문에 파라미터 수는 많지 않은 편
https://datascience.stackexchange.com/questions/23183/why-convolutions-always-use-odd-numbers-as-filter-size
17. Pool Layer
• Subsampling 기법
• 인접한 셀은 비슷한 정보를 갖기 때문에 압축으로 효율을 높임
• Max Pooling, Average Pooling 기법이 자주 쓰임
https://www.quora.com/What-is-max-pooling-in-convolutional-neural-networks
https://computersciencewiki.org/index.php/Max-pooling_/_Pooling
18. Flat Layer
• Conv, Pool 뒤에 배치됨
• Conv, Pool 의 결과를 Flat 이 받아서 Dense(FC) 를 배치할 수 있도록
1차원으로 길게 나열
https://towardsdatascience.com/convolutional-neural-networks-from-the-ground-up-c67bb41454e1
19. Dense Layer
• Fully-Connected Layer 라고도 함
• 모든 뉴런이 1대 1로 대응되는 가장 기본적인 Layer
• 뉴런 개수에 따라 파라미터 수가 급증
https://github.com/drewnoff/spark-notebook-ml-labs/tree/master/labs/DLFramework
20. Dropout Layer
• 학습 과정에서 랜덤하게 일정 뉴런을 off 하는 Layer
• 뉴런 사이의 상호 의존성(codependency) 을 줄여서 오버피팅을 방
지하기 위한 목적
https://medium.com/@amarbudhiraja/https-medium-com-amarbudhiraja-learning-less-to-learn-better-dropout-in-deep-machine-learning-74334da4bfc5
21. 퍼포먼스를 높이기 위한 노력
• 더 많은 (더 깊은) Conv Layer
• Image Augmentation
22. 더 많은 (더 깊은) Conv Layer
• 딥러닝에서 네트워크 구조를 깊게 쌓
는 것이 가능해진 이후, Conv Layer 가
중첩된 더 깊은 구조가 계속 나타남
https://arxiv.org/abs/1709.01921
23. 더 많은 (더 깊은) Conv Layer
• 깊이가 깊어질수록 퍼포먼스
는 상승
• 학습 속도 느려짐, 오버피팅
위험
https://medium.com/finc-engineering/cnn-do-we-need-to-go-deeper-afe1041e263e
24. Image Augmentation
• Train data 의 편향을 보완하기 위한 기법
• 이미지 기울이기, flip, zoom in/out, crop 등으로 train data 수를 늘려 네
트워크의 대응성을 높임
• 학습 속도 느려짐
https://becominghuman.ai/data-augmentation-using-fastai-aefa88ca03f1
26. Conv2D
• 컬러 채널이 있는 2D 이미지(3D 데이터)를 input 으로 받음
• 높이 x 너비 x 컬러 채널
• Output 도 3D 데이터가 됨
• 높이 x 너비 x 필터 개수
https://medium.com/@udemeudofia01/basic-overview-of-convolutional-neural-network-cnn-4fcc7dbb4f17
28. kernel_size
• Filter 가 한 step 마다 계산하는 영역의 크기
• Receptive field 라고도 함
https://github.com/vdumoulin/conv_arithmetic
kernel_size = (3, 3) kernel_size = (4, 4)
29. strides
• Filter 가 한 step 마다 이동하는 크기
• Strides 가 커지면 출력 이미지가 작아짐
strides = (1, 1) strides = (2, 2)
https://github.com/vdumoulin/conv_arithmetic
30. padding
• valid : filter window 가 input 안에만 위치하도록 함
• same : output 의 size 가 input 과 같아지도록 함
• zero padding : 남는 공간을 0 으로 채워서 계산
https://github.com/vdumoulin/conv_arithmetic
padding = ‘valid’ padding = ‘same’
31. filters
• Conv Layer 를 구성하는 filter 의 수
• Filter 의 수는 네트워크가 얼마나 많은 feature 를 추출할 수 있는지
를 결정
34. Hello World – MNIST
• 0~9로 라벨링된 28x28 pixel의 손글씨 이미지 70,000장을 분류
• 1998년부터 머신러닝의 benchmark 중 하나로 활용됨
https://theanets.readthedocs.io/en/stable/examples/mnist-classifier.html
35. Hello World – MNIST
• Performance : Error rate
• CNN 이 가장 좋은 퍼포먼스를 보임
https://en.wikipedia.org/wiki/MNIST_database
36. Hello World – MNIST
• Tensorflow 홈페이지의 <Get started with TensorFlow 2.0 for beginners> 를
기반으로 수정
안녕하세요.
저는 오늘 Tensorflow 2.0 Tutorial, CNN 이라는 주제로 발표를 맡은 엔씨소프트의 김환희라고 합니다.
목차는 다음과 같습니다.
먼저 CNN 에 대해 아시는 분도 많겠지만 복습 차원에서 중요한 점들을 같이 살펴보고,
Tensorflow 2.0 에서 CNN 을 사용하는 간단한 방법을 아주 짧게 살펴본 다음에,
Google Colab 으로 준비한 샘플 코드와 함께 MNIST 데이터 셋을 classification 하는 예제를 다양하게 살펴보도록 하겠습니다.
먼저 CNN 소개입니다.
CNN 은 현재 딥러닝이 가장 잘하고 있는 분야 중 하나입니다.
CNN 의 발전을 이끈 계기 중 하나로 1400 만 장의 이미지를 올바른 카테고리로 분류하는 ImageNet 대회가 있습니다.
이 대회에서 2012 년 AlexNet, 2014 년 GoogLeNet, 2015 년 ResNet 등 CNN의 많은 혁신이 있었습니다. 2015 년에 인간보다 좋은 퍼포먼스를 보였고, 2017 년 이후로는 이 문제를 푸는 데에 어느 정도 한계에 도달했다고 판단했는지 대회가 더 이상 열리지 않고 있습니다.
CNN 은 Convolutional Neural Network 의 준말입니다.
네이버의 IT 용어 사전에는 각각의 픽셀을 본래 픽셀과 그 주변 픽셀의 조합으로 대체하는 동작이라고 나와 있습니다.
간단히 생각하면 포토샵의 필터 같은 것이라고 할 수 있습니다. 그림의 Convolutional Layer 를 보시면 기존 이미지가 다른 색과 명도로 변환된 것을 보실 수 있습니다.
Convolutional Neural Network 는 크게 Convolutional Layer 와 Dense Layer 로 구분할 수 있는데, 이 둘은 각각 Feature Extractor 와 Classifier 의 역할을 합니다.
Classifier 는 말 그대로 어떤 정보를 특정 카테고리로 분류하는 역할을 합니다. 사진을 보고 이것이 동물인지 건축물인지 분류하는 것입니다.
그럼 Feature Extractor 는 무엇인지에 대해서 좀 더 자세히 설명드리겠습니다.
먼저 Convolution 연산은 원본 이미지에 일정 크기의 필터를 합성해서 더한 값으로 새로운 이미지를 생성하는 것입니다.
이미지로 예시를 들어보면 가운데에 있는 4개의 필터를 왼쪽 이미지에 씌우면 오른쪽과 같이 변환이 됩니다.
이렇게 변환된 결과 이미지에서 Feature 라고 불리는 것을 얻을 수 있습니다.
Feature 는 이미지의 외곽선이나 코너 같은 이미지의 특징을 말합니다. 이런 특징을 검출하면 전통적인 vision 연구의 주제인 사물 감지, 사물 인식, 노이즈 제거 등의 문제를 풀 수 있습니다.
그리고 이미지 뿐만 아니라 오디오 등 다른 분야에서도 feature 를 추출하는 다양한 방법이 개발되어 왔습니다.
하지만 이 방법들을 적용하기 위해서는 전문적인 지식이 필요하고, 수행에 시간이 오래 걸리며 다른 도메인에 일반화하기 힘들다는 단점이 있었습니다.
그런데 CNN 을 비롯한 신경망은 Feature 를 자동으로 추출합니다. 이 이미지는 구글넷에서 각 뉴런의 활성화된 정도를 보여줍니다. 학습 과정이 지속되면 각 뉴런은 특정 패턴을 잘 검출할 수 있도록 바뀌게 됩니다.
Feature Extraction 은 CNN 을 포함한 신경망 네트워크의 특징입니다. CNN 은 보통 여러 층을 쌓아올리는데 이때 각 층별로 추출되는 feature 의 특징이 달라집니다. 이미지에 가까운 low-level layer 는 이미지의 큰 부분을 추출하는 경향이 있고, high-level layer 는 세밀한 부분에 집중하는 경향이 있습니다.
이 그림에서는 각 레이어와 그 레이어에 가장 잘 활성화되는 이미지의 부분을 표시한 것입니다. Layer 1과 Layer 2 에서는 모서리, 원형 같은 이미지의 추상적인 특징을 잡아냅니다.
Layer 5 에서는 사람의 얼굴, 개와 부엉이의 얼굴, 자전거의 바퀴 등을 잡아냅니다. Layer 1 에서 Layer 5 로 갈수록 점점 사람이 알아보기 쉬운 세밀한 부분을 잘 잡아내는 것을 확인할 수 있습니다.
일반적인 CNN 의 구조는 Convolution Layer 와 Pooling Layer 가 초반에 배치되어 Feature Extraction 을 한 다음, 마지막 단의 Dense Layer 에서 올바른 라벨에 대한 Classification 을 하는 구조입니다.
그럼 각 레이어를 하나씩 살펴보겠습니다.
먼저 Convolution Layer, 줄여서 Conv Layer 는 보통 2D 이미지를 받아서 출력 이미지를 반환하는 역할을 합니다. 그 과정에서 데이터의 feature 를 자동 추출하는데, 이 filter 는 이미지의 모든 영역에 대해서 convolution 을 계산하기 때문에 파라미터 수는 많지 않은 편입니다.
Pooling Layer 는 이미지의 크기를 줄이면서 중요한 정보만 남기는 역할을 합니다. Max Pooling 은 사각형의 영역 중에 Max 값만 남기게 되고, Average Pooling 은 평균값을 남기게 됩니다.
Flat Layer 는 Conv 나 Pool 의 출력을 1차원으로 길게 나열해주는 역할을 합니다. 입방체로 표시된 것처럼 데이터의 차원이 3차원이기 때문에 이것을 1차원으로 바꿔줍니다.
Dense Layer 는 일반적으로 가장 많이 쓰이는 기본적인 Layer 입니다.
모든 뉴런에 1대 1로 대응하기 때문에 뉴런이 많아질수록 파라미터 수가 급증합니다.
Dropout Layer 는 학습 과정에서 랜덤하게 일정 뉴런을 off 해주는 역할을 합니다. Dense Layer 는 모든 뉴런이 서로 연결되어 있기 때문에 뉴런 사이에 상호 의존성이 높습니다. 상호 의존성이 높으면 서로의 값에 영향이 커지기 때문에, 서로 비슷한 결과값을 가지게 되어 오버피팅이 발생합니다. 이를 막기 위해서 학습 과정에서만 랜덤하게 뉴런을 꺼주고, 실제로 결과를 테스트할 때에는 모든 뉴런을 켜줍니다.
CNN 에서 퍼포먼스를 높이기 위해서는 여러 가지 방법이 있겠습니다만, 오늘은 2가지에 초점을 맞춰보려 합니다.
첫번째는 Convolution Layer 를 더 많이 쌓는 것입니다. 1998 년의 LeNet 이 5개 Layer 를 쌓은 이후, Layer 수는 점점 많아졌습니다.
그리고 깊이가 깊어질수록 퍼포먼스는 좋아졌습니다. 이제는 랜덤한 네트워크 구조 생성 등 다른 방법들도 개발되고 있지만, 현재까지 컨볼루션 레이어를 쌓을수록 성능이 증가한다는 점은 계속 증명되어 왔습니다. 하지만 너무 많은 컨볼루션 레이어를 사용하면 학습 속도가 느려질 것이고 오버 피팅이 발생할 위험도 있습니다.
그리고 Train date 의 편향을 보완하기 위해서, 데이터에 랜덤한 변형을 가하는 방법이 있습니다. 이미지에 이런 변형을 가해서 숫자를 늘리는 것을 Image Augmentation 이라고 합니다.
이렇게 되면 다양한 Train data 를 많이 가지고 있는 듯한 효과를 얻을 수 있습니다.
다만 이렇게 되면 데이터의 수 자체가 많아지기 때문에 역시 학습 속도가 느려지는 결과를 낳습니다.
그럼 Tensorflow 2.0 에서 CNN 을 쓰는 방법을 간략하게 알아보겠습니다. 자세한 내용은 뒤의 Sample Code 에서 다룰 예정이기 때문에, 여기서는 Convolution Layer API 에 대한 설명만 간략히 드리겠습니다.
Tensorflow 2.0 에서 API 를 간략하게 만들고 통합했기 때문에, tf.keras.layers 에서 Conv2D Layer 를 간단하게 불러올 수 있습니다.
Conv2D 레이어는 2D 이미지를 Input 으로 받는데, 이미지는 RGB 라는 3개의 컬러 채널로 구성되어 있기 때문에 이미지는 3차원 데이터라고 말할 수 있습니다.
그리고 실제 학습에서 한 장의 이미지만 학습하지 않고 여러 장의 이미지를 학습할 것이기 때문에, 실제 input data 는 4차원이 됩니다.
여기에 Conv Layer 를 불러오는 예제 코드가 있습니다. 여기에 있는 주요 매개 변수에 대해서 설명을 드리겠습니다.
먼저 kernel_size 는 Filter 가 한 step 마다 계산하는 영역의 크기입니다. 이 그림에서 아래쪽의 파란색이 인풋 이미지이고 초록색이 아웃풋 이미지일 때, 왼쪽은 kernel_size 가 3 by 3 영역이고, 오른쪽은 4 by 4 입니다.
strides 는 필터가 한 스텝마다 이동하는 크기입니다. Stride 가 커지면 출력 이미지가 작아집니다. 오른쪽은 strides 가 1 by 1 이었다면 3 by 3 의 출력 이미지가 되었어야 하겠지만, strides 가 2 by 2 이기 때문에 계산 결과 출력도 2 by 2 의 이미지가 되었습니다.
Padding 은 헷갈리기 쉬운 개념입니다. 일단 여기서는 두 가지의 옵션을 제공하는데, valid 는 filter window 가 인풋 이미지 안에서만 움직이도록 하는 것입니다. 따라서 남는 공간은 버려지게 됩니다.
Same 은 인풋과 아웃풋 이미지의 크기가 같아지도록 인풋 이미지 주변에 임의의 값을 넣어서 조절하는 것입니다. 여기서 임의의 값을 0으로 넣으면 zero padding 이 됩니다.
Filters 는 Conv Layer 를 구성하는 filter 의 수입니다. 이 숫자는 네트워크가 얼마나 많은 feature 를 추출할 수 있는지를 결정하기 때문에 많을수록 좋지만, 너무 많을 경우 학습 속도가 느려질 수 있고 오버 피팅이 발생할 수도 있습니다.
보시는 것처럼 많은 필터를 가지고 있다는 것은 다양한 feature 를 추출할 수 있다는 뜻이 됩니다. 하단의 이미지에서 오른쪽 필터를 거치면 왼쪽과 같은 feature 가 추출됩니다.
그럼 이제 실제 샘플 코드와 함께 Tensorflow 2.0 에서 CNN 을 사용하는 방법을 간단히 학습해보도록 하겠습니다.
딥러닝을 배울 때 가장 처음 다루게 되는 데이터 중 하나는 MNIST 입니다. MNIST 는 얀 르쿤이 1998 년에 발표한 논문 이후 머신러닝의 벤치마크 중 하나로 활용되었습니다. 70,000 장의 데이터로 간단하게 CNN 을 해볼 수 있고, 네트워크 구조나 하이퍼파라미터를 바꿀 때 퍼포먼스가 어떻게 변하는지 빠르게 알 수 있습니다.
MNIST 의 주요 퍼포먼스 리스트를 보면, 다른 방법들을 물리치고 CNN 이 상위에 위치해 있는 것을 볼 수 있습니다. 정확도 99% 이상으로 10 개의 라벨을 예측합니다.
이 예제는 Tensorflow 홈페이지의 초심자 대상 colab 을 기반으로 많은 부분이 수정되었습니다.