본문 바로가기

머신러닝 & 딥러닝 공부/Tensorflow

[Tensorflow dev 자격증] Augmentation : A technique to avoid overfitting

반응형

 

 

 

github.com/jonhyuk0922/Tensorflow-Dev/blob/main/Course2_2_Augmentation_A_technique_to_avoid_overfitting.ipynb

 

jonhyuk0922/Tensorflow-Dev

Study and Review for Tensorflow Developer Certificate (coursera , DeeplearningAI) - jonhyuk0922/Tensorflow-Dev

github.com

 

안녕하세요

27년차 진로탐색꾼 조녁입니다!

 

오늘은 텐서플로우 자격증 과정 두번째 강좌인

' Convolutional Neural Networks in TensorFlow 

2주차 강의( Augmentation : A  technique to avoid overfitting) 및 자료를 공부했습니다.

 

 

course1의 4주차 강의를 이해못하고 넘어왔더니 course2 - 1주차 강의 과제(개-고양이 분류)에서 애먹었습니다..

그래서 복습하고 git_hub의 도움으로 과제 겨우 제출하고 넘어왔습니다! 휴!!

 

2주차에서는 오버피팅을 피할 수 있는 증강에 대해서 배웁니다.

아무래도 동영상이나 읽기자료마다 정리하는 것이 오래걸리고 귀찮지만 이렇게 안하면 마지막 과제랑 퀴즈때 멘붕오더라고요 ..

그래서 그냥 다시 하나하나 정리하고자 합니다!

 

 

첫번쨰 영상, 고양이-개 분류 문제는 25,000개의 학습 데이터를 가지고 있었다. 때론 이만큼 충분한 데이터가 없을 수도 있고, 혹은 그 데이터만으로 충분하지 않을 수 있다.  이러한 경우에 증강(Augmentation)을 사용할 수 있다. 이 때, 우리가 증강한 이미지를 어떤 디렉토리에 저장하고 어떻게 불러오는 지 등도 함께 배운다.

 

 

두번쨰 읽기자료, 증강의 개념은 간단하다. 고양이를 예로 들면, 사진을 회전시킴으로써 누워있는 고양이에 대해 학습시킬 수 있다. 만약 서있는 고양이들만 학습시켰다면, 그에 대한 과대적합으로 test set으로 누워있는 고양이 이미지가 주어진다면 분별하지 못했을 것이다.

 

 

세번째 영상,  우리가 말과 사람 , 개와 고양이와 같은 바이너리 분류를 할 때 꽤나 훌륭한 결과를 낸다. 하지만 작은 학습데이터는 과대적합을 불러올 수 있다. 과대적합(overfitting)의 개념을 이해시키기 위해 다음 예시로 설명한다.

 

왼쪽 그림의 신발들이 여러분 인생에서 유일하게 본 신발들이라고 가정하자. 이 때, 사이즈가 바뀌더라도 훌륭히 분류해낼 것이다. 

 

 

 

 

 

그러나 하이힐 이미지가 주어 진다면? 신발이지만 신발로 분류하지 못할 것이다.

왜냐하면 여러분이 태어나서 본 게(학습한 게) 하이로 올라온 신발 뿐이므로 

지나치게 그에 적합한 것만 신발로 이해했기 떄문이죠.

 

 

 

 

 

 

 

이와 같이, 우리가 작은 데이터셋으로 학습 시킬 때 오버피팅을 피하기위한 방법 중 하나를 소개한다. 바로 "증강(augmentation")이다.

 

 

CNN을 사용하면 필터를 통해 위와 같이 고양이의 뾰족귀, 사람의 두 다리와 같은 특징을 파악할 수 있다. 

그러나 아래 사진을 보라. 고양이의 뾰족한 귀를 CNN 컨볼루션 필터를 통해 파악하고자 했지만, 고양이가 누워있다면?

 

 

 

만약 학습 데이터에 누워있거나 기대어 있는 고양이가 없었다면 오버피팅이 발생해서 분별하지 못할 것이다.

하지만 사진을 회전시키는 이미지 증강을 통해 위와 같은 오버피팅을 피할 수 있다.

 

 

네번째 읽기자료, 코딩을 시작하며 Keras 공식사이트에서 증강에 대한 코드를 보시오. keras.io/api/preprocessing/image/

(사이트 들어가서 ImageDataGenerator class를 검색해보자. 유익하다.)

 

Keras documentation: Image data preprocessing

Image data preprocessing image_dataset_from_directory function tf.keras.preprocessing.image_dataset_from_directory( directory, labels="inferred", label_mode="int", class_names=None, color_mode="rgb", batch_size=32, image_size=(256, 256), shuffle=True, seed

keras.io

 

 

다섯번째 영상, Coding augmentation with ImageDataGenerator

아래 코드를 보면서 하나씩 이해해보자. 혹시 설명이 부족하거나 이해가 안된다면 위에 Keras 공식 홈페이지에 들어가서 해당 내용 검색해보기 추천한다.

 

 

이전과 같이 우리는  한번에 이미지 크기를 rescale을 통해 맞춰줄 수 있다. 

추가로 rotation_range=40, 은 0~40도 사이에 랜덤하게 회전하여 이미지를 증강 시킬 수 있다. (0~180도 가능)

 

또한, 우리가 학습하는 이미지는 보통 중앙에 위치해있습니다.  이 때, width_shift_range =0.2 , height_shift_range=0.2를 통해 중앙에서 

얼마만큼 떨어지도록 설정할 수 있다. 

 

shear_range도 굉장히 강력하다. 아래 첫번째 그림을 두번째 그림과 같이 이미지를 변화시킬 수 있다.

 

적용 전 이미지

 

shearing 한 이미지

 

 

zoom_range는 사진을 확대해서 아래와 같이 사용될 수 있다.

 

 

 

horizontal_flip은 그저 True를 넣어서 쉽게 사용할 수 있다. 아래 첫번째 예시그림(왼쪽)을 두번쨰 그림과 같이 반전시킬 수 있다. 

 

적용 전 이미지

 

horizontal_flip 후 이미지

 

 

fill_mode 는 nearest값이 기본 값으로, 손실된 픽셀을 채워준다. 종류는 아래와 같이 4가지고 규칙은 각각 다음과 같이 채워진다.

 

 - 'constant': kkkkkkkk|abcd|kkkkkkkk (cval=k) 

 -  'nearest': aaaaaaaa|abcd|dddddddd

 -  'reflect': abcddcba|abcd|dcbaabcd
 -  'wrap': abcdabcd|abcd|abcdabcd

 

 

여섯번째 읽기자료, 전 영상에서 증강에 대한 기본적인 내용들을 배웠다.개와 고양이 분류기에서 증강이 없이 돌렸을 때 얼마나 빠르게 오버피팅에 도달하는 지 확인해보자. 직접 실행해보고 싶다면, 아래 노트북을 활용해라.

gist.github.com/jonhyuk0922/ae8a97ef3064e44775a0286c7a62cc65

 

Course 2 - Part 4 - Lesson 2 - Notebook (Cats v Dogs Augmentation).ipynb

Course 2 - Part 4 - Lesson 2 - Notebook (Cats v Dogs Augmentation).ipynb - course-2-part-4-lesson-2-notebook-cats-v-dogs-augmentation.ipynb

gist.github.com

 

 

일곱번째 강의, 위에 깃허브에 올린 코드를 살펴봤다. 작은 데이터(2,000개)로 긴 에폭을 돌렸을 때, 학습데이터에 대한 정확도는 20 에폭이후 100%에달하지만, validation accuracy는 약 70%에 머물고 있다. 기존 개-고양이는 잘 분류하지만 새로 주어진 데이터에 대해선 70%까지만 분류하는 것을 볼 수 있다.

 

 

여덟번째 읽기자료, 우리는 오버피팅이 일어나는 것을 확인했다. 이제 CNN에 증강(Augmentation)을 더해 오버피팅이 덜한 데이터를 제공해 볼 것이다,

 

 

아홉번째 강의, 우리는 증강을 제외한 모든 것이 동일한 코드를 사용할 것이다. 2개의 class에 2,000개의 이미지가 있는 것을 확인할 수 있다. 다만 증강을 추가해서 학습을 돌리면, 초반에는 정확도가 더 떨어지는 것을 볼 수 있다. 이것은 랜덤하게 증강하기 때문이다. 그러나 에폭이 돌수록 정확도는 꾸준히 올라서 종전에는 81% (증강 없을 때보다 10%가량 높다) 에 도달한다. 학습을 진행할수록 validation accuracy가 동반 상승하는 것으로 보아 오버피팅이 해결되었음을 확인할 수 있다.

 

 

열번째 읽기자료, 이전 영상에서 눈으로 본 것을 직접 코드로 실행해보자. (정확도를 높이기 위해서 에폭 더 늘려보기)

gist.github.com/jonhyuk0922/fdd19c02f843c7da9b84dc37da3fc97d

 

Course 2 - Part 4 - Lesson 4 - Notebook.ipynb

Course 2 - Part 4 - Lesson 4 - Notebook.ipynb. GitHub Gist: instantly share code, notes, and snippets.

gist.github.com

 

열한번째 영상, 개와 고양이 분류 문제에서는 증강을 통해 오버피팅이 개선되었다. 하지만 모든 부분에서 이것이 통하지는 않는다.

예를 들어, 말과 사람분류 문제에 증강을 적용해보겠다. 우리는 더 나아진 결과를 기대했지만 실제로 validation accuracy가 에폭이 60-70이후로 가도 요동치는 것을 볼 수 있다. 이것은 학습 데이터나 테스트 데이터가 모두 정형화 되어있어서 증강으로 부여한 랜덤성(?)이  결코 도움이 되지 않고 validation accuracy를 되려 요동치게 만든다는 걸 볼 수 있다.

 

열두번째 읽기자료, 이번 주에는 텐서플로우가 제공하는 증강에 대해 배웠다. 이때, 증강(Augmentation)은 학습 데이터를 늘려줘서 더 큰 데이터 세트를 효과적으로 시뮬레이션하는 효과를 줄 수 있었다. 배운 것이 여러분에게 도움이 되었길 바랍니다.

 

이후 퀴즈는 무난했다. 기억에 남는 것은 증강은 메모리를 사용하지 않는 다는 것과 아래 틀린 문제에 대한 내용이다.

 

질문 3 When training with augmentation, you noticed that the training is a little slower. Why?

1) Because the augmented data is bigger

2) Because the image processing takes cycles

3) Because the training is making more mistakes

4) Because there is more data to train on

풀이 : 2번, 이미지 처리에는 주기가 필요하기 떄문이다. 이해하기론 증강하는데 드는 시간을 말하는 것 같다.

 

* 과제 : 증강(Augmentation)을 추가하여 개-고양이 분류하기!

www.kaggle.com/c/dogs-vs-cats

 

Dogs vs. Cats

Create an algorithm to distinguish dogs from cats

www.kaggle.com

 

 

반응형