Data Augmentation
- 적은 데이터로 학습 시 과적합이 발생하기 쉽다. 훈련 데이터를 수집하기 어려울 때, 기존 데이터를 변형해서 훈련 데이터를 늘려줄 수 있다. 이것을 Data Augmentation이라고 한다.
- 사용하는 라이브러리/프레임워크에 따라 방법은 가지각색, 이미지 데이터인 경우 tensorflow에서는 keras의 preprocessing 모듈 중 ImageDataGenerator를 사용하는 방법이 일반적이다.
- Data Augmentation 으로 만들어진 데이터도 역시 과적합이 발생할 수 있으므로, Dropout을 활용해서 랜덤하게 일부 데이터를 학습에서 제외시킨다.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255, horizontal_flip=True, width_shift_range=0.1, height_shift_range=0.1)
- expand_dims는 왜 하는 걸까?
- ImageDataGenerator의 flow 함수가 numpy 4차원 행렬을 요구하므로 차원을 더해 줬다.
- ex. 원본 shape: (479, 500, 3) -> 차원확장 후 shape: (1, 479, 500, 3)
실습: O와 X 구분
- 훈련/테스트에 사용된 이미지
- 그림판(Ubuntu Kolourpaint)
- 아이폰 메모 그림
- 우분투 시스템 폰트
- 종이에 펜으로 그린 후 사진
- 종이에 매직으로 그린 후 사진
flow_from_directory
- 라벨링을 디렉토리로 한 경우 사용하기 좋다.
- O와 X를 구분하기 위한 이미지를 binary class로 가져온다.

CNN LeNet

-
1998년에 발표된 모델로, 최신 모델에 비하면 정확도가 낮은 편
-
Convolutional Neural Network에 대해 이해하기 위해 사용해 봅니다.
-
Convolution으로 이미지의 특징을 추출
- 위 코드에서는 32개의 채널(특징)을 찾아내고, 2x2 행렬 크기로 화면 전역에 적용해서 추상화
- maxPooling: 화면의 하얀 부분에 집중(mnist 데이터 또는 MRI처럼 배경이 까맣고 숫자/이미지는 하얀색인 경우)
- averagePooling: 이미지를 smooth하게 함
- minPooling: 배경이 하얗고 집중해야 하는 이미지가 까만색
-
활성화 함수로 relu를 사용하여 sigmoid에 비해 학습 효율이 좋다
-
stride는 설정하지 않음: 디폴트값 1 (데이터를 줄일 경우 2 이상으로 설정)
-
Flatten: 2차원 데이터를 1차원 데이터로
-
Dense: fully connected layer 생성
- 마지막 Conv2D가 64개 채널을 가지고 있었으므로, 첫 번째 Dense도 64개 채널을 가져옴
- 두 번째/마지막 Dense는 출력 뉴런은 하나, sigmoid probability를 구하기 위한 것
-
Dropout으로 일부 데이터를 버림
model summary

model compile

model fit (학습)

- ReduceLROnPlateau: 정확도가 2에포크 동안 높아지지 않으면 learning rate 조절
- learning rate: 너무 높으면 불안정하고 너무 낮으면 학습이 안됨
- EarlyStopping: 정확도가 10에포크 동안 높아지지 않으면 지정한 epoch를 마치지 않고 학습을 종료
- ModelCheckpoint: 이전 에포크보다 정확도가 높아졌을 때 모델을 저장

- 매 에포크에 callback 함수로 위에서 지정한 함수 실행
학습 결과

- 훈련 데이터 약 98%, 테스트 데이터 약 93% 정확도로 학습 종료
학습 history로 그래프 그리기


confusion matrix 그리기


틀린 이미지는 어떻게 생겼나?
- 훈련 데이터에서


- 비슷한 코드로 검증 데이터도 확인

- 중간에 '오'는 틀리라고 넣은 데이터
- 그래도 양옆 이미지는 맞췄어야 할 것 같다
왜 틀렸는지 더 궁금해하지 않고 적중률 높은 모델을 찾아 떠납니다..
VGG16 전이학습

- VGG16이라는 성능 좋은 모델을 가져와서 일부를 Dropout

- 5만 개 정도 학습할 수 있는 param이 생겼습니다

- 더 적은 학습으로 더 좋은 성능을 가지게 되었어요
- 무려 정확도가 100% (훈련 데이터 한정이지만)


- 테스트 데이터에서도 하나 빼고 다 맞췄습니다.