https://insengnewbie.tistory.com/214
실무에서 딥러닝 모델을 이용하여 문제를 풀 경우 overfitting 문제에 봉착하는 경우가 많다. overfitting 을 해결하는 가장 완벽한 방법은 더 많은 그리고 더 다양한 데이터 셋을 모아 딥러닝 모델을 학습하는 것이다. 하지만 실무에서는 더 많은 데이터를 수집하는데 에는 한계가 있다. 이렇게 제한되어 있는 데이터를 가지고 있는 상황에서 overfitting을 해결하는 방법은 Data Augmentation을 수행하여 좀 더 다양한 분포의 데이터를 만들고 이를 모델에 학습 시키는 것 입니다. ImageDataGenerator API 는 이미지 데이터의 Augmentation 작업을 쉽게 수행 할 수 있도록 도와 줍니다. 앞서 실습한 가위-바위-보 데이터 셋 분류 모델에 DataAugmentation을 적용하여 좀 더 성능 좋은 모델을 구현하는 실습을 진행하겠다.
- 훈련 데이터셋에 대해 수많은 데이터 분포가 생성되므로, Epoch을 늘려 많은 데이터를 학습할 수 있도록 한다.
- 테스트 데이터셋은 DataAugmentation을 적용해선 안된다. 학습에 영향을 미치는 요소가 아니라서 리소스만 잡아먹는다.
import tensorflow as tf
from tensorflow import keras
import os
""" Step 1. Input tensor 와 Target tensor 준비(훈련데이터)
Step 1-(1) 가위-바위-보 데이터셋 다운로드
"""
train_url = 'https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps.zip'
test_url = 'https://storage.googleapis.com/laurencemoroney-blog.appspot.com/rps-test-set.zip'
# 수강생 작성 코드
# 1. tensorflow.keras.utils 모듈의 get_file API를 이용하여 가위-바위-보 학습 데이터 셋 다운로드
keras.utils.get_file(fname='rps.zip', origin=train_url, extract=True, cache_dir='/content')
# 수강생 작성 코드
# 1. tensorflow.keras.utils 모듈의 get_file API를 이용하여 가위-바위-보 테스트 데이터 셋 다운로드
keras.utils.get_file(fname='rps-test-set.zip', origin=test_url, extract=True, cache_dir='/content')
""" Step 1-(2) ImageDataGenerator를 이용해 이미지 파일을 load 하기 위한 경로 지정"""
# 수강생 작성 코드
# 1. 저장된 학습, 테스트 데이터를 읽어 오기 위한 경로 정보 생성
# - hint : os.path.dirname() 메서드를 이용하여 데이터 셋이 저장된 경로 추출
# => /root/.keras/datasets/rps_test-set.zip => /root/.keras/datasets/
train_dir = os.path.dirname('/content/datasets/rps.zip')
test_dir = os.path.dirname('/content/datasets/rps-test-set.zip')
""" Step 1-(3) ImageDataGenerator 객체 생성
- 객체 생성 시 rescale 인자를 이용하여 텐서 내 원소의 범위를 [0 ~ 255] => [0 ~ 1] 로 ReScaling 진행
- Data Augmentation 을 위한 정보들 설정
- 검증 데이터 셋은 Augmentation 미수행
- featue 이미지의 size를 (150, 150) 으로 resize 수행
- label 데이터는 one-hot-encoding 수행
"""
# 수강생 작성 코드
# 1. ImageDataGenerator API 를 이용하여 학습 데이터와 테스트 데이터를 읽어오기 위한 객체 생성
# - feature 데이터를 [0, 1] 사이로 scailing을 수행하세요
# - Data Augmentation 을 위한 정보들을 설정하세요
# - 검증 데이터 셋은 Augmentation 미수행 해야 정확학 성능이 측정 됩니다.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
test_datagen = ImageDataGenerator(rescale=1./255)
""" - flow_from_directory() 메서드를 이용하여 학습데이터와 검증데이터를 위한 DirectoryIterator 객체 생성 """
# 수강생 작성 코드
# 1. ImageDataGenerator 객체의 flow_from_directory 메서드를 이용하여 데이터를 읽어오기 위한 정보 설정
# - featue 이미지의 size를 (150, 150) 으로 resize 수행하세요
# - label 데이터는 one-hot-encoding 수행하세요
train_generator = train_datagen.flow_from_directory(directory=train_dir,
target_size=(150, 150),
batch_size=32,
shuffle=True,
class_mode='categorical')
test_generator = test_datagen.flow_from_directory(directory=test_dir,
target_size=(150, 150),
batch_size=32,
class_mode='categorical')
""" Step 2. CNN 모델 디자인"""
# 수강생 작성 코드
# 1. Sequential API를 이용하여 가위-바위-보 데이터셋 을 분석 하기 위한 CNN 모델을 디자인 하세요
# - label 데이터를 one-hot-encoding 한 것을 반영 하여 모델을 디자인 하세요
from tensorflow.keras import models, layers
model = models.Sequential()
model.add(layers.Conv2D(filters=32, kernel_size=(3, 3),
activation='relu',
input_shape=(150, 150, 3)))
model.add(layers.MaxPool2D(pool_size=(2, 2)))
model.add(layers.Conv2D(filters=64, kernel_size=(3, 3),
activation='relu'))
model.add(layers.MaxPool2D(pool_size=(2, 2)))
model.add(layers.Conv2D(filters=128, kernel_size=(3, 3),
activation='relu'))
model.add(layers.MaxPool2D(pool_size=(2, 2)))
model.add(layers.Conv2D(filters=128, kernel_size=(3, 3),
activation='relu'))
model.add(layers.MaxPool2D(pool_size=(2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(units=512, activation='relu'))
model.add(layers.Dense(units=2, activation='softmax'))
""" Step 3. 모델의 학습 정보 설정"""
# 수강생 작성 코드
# 1. tf.keras.Model 객체의 compile 메서드를 이용하여 학습을 위한 정보들을 설정하세요
# - optimizer
# - loss : label 데이터를 one-hot-encoding 한 것을 반영 하여 지정하세요
# - metrics : 체점 기준인 accuracy 로 설정
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
""" Step 4. 모델에 데이터 generator 연결 후 학습"""
# 수강생 작성 코드
# 1. tf.keras.Model 객체의 fit 메서드를 이용하여 모델을 학습하세요
# - fit 메서드의 verbose=2 로 설정 하세요
history = model.fit(train_generator,
steps_per_epoch=len(train_generator),
epochs=100, verbose=2,
validation_data=test_generator,
validation_steps=len(test_generator))
import matplotlib.pyplot as plt
# 모델의 학습과정 시각화
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and Validation Accuracy')
plt.legend()
plt.show()
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()
Epoch 11/100 91/91 - 35s - loss: 0.2135 - accuracy: 0.9561 - val_loss: 0.0692 - val_accuracy: 0.9678 - 35s/epoch - 386ms/step Epoch 12/100
...
Epoch 31/100 91/91 - 35s - loss: 0.1101 - accuracy: 0.9654 - val_loss: 0.0079 - val_accuracy: 0.9986 - 35s/epoch - 382ms/step
...
Epoch 51/100 91/91 - 34s - loss: 0.0738 - accuracy: 0.9851 - val_loss: 0.0233 - val_accuracy: 0.9945 - 34s/epoch - 378ms/step
...
Epoch 71/100 91/91 - 35s - loss: 0.0616 - accuracy: 0.9907 - val_loss: 0.0207 - val_accuracy: 0.9959 - 35s/epoch - 380ms/step
...
Epoch 91/100 91/91 - 34s - loss: 0.1357 - accuracy: 0.9862 - val_loss: 0.0031 - val_accuracy: 1.0000 - 34s/epoch - 376ms/step
...
Epoch 100/100 91/91 - 34s - loss: 0.0912 - accuracy: 0.9931 - val_loss: 0.0039 - val_accuracy: 0.9993 - 34s/epoch - 379ms/step
'프로젝트 > 코드프레소 체험단' 카테고리의 다른 글
이미지 데이터 처리를 위한 CNN 완벽 가이드 - 완강 후기 (0) | 2022.03.15 |
---|---|
이미지 데이터 처리를 위한 CNN 완벽 가이드 - Transfer Learning을 활용한 성능 개선 (0) | 2022.03.15 |
이미지 데이터 처리를 위한 CNN 완벽 가이드 - Transfer Learning (0) | 2022.03.14 |
이미지 데이터 처리를 위한 CNN 완벽 가이드 - DataAugmentation (0) | 2022.03.14 |
이미지 데이터 처리를 위한 CNN 완벽 가이드 - 가위바위보 데이터셋 분류 CNN 모델 구현 (0) | 2022.03.14 |