기존에는 numpy 형태로 이미 처리된 이미지 데이터를 사용했기 때문에, 파일 형태의 이미지 데이터을 분석하는 실무 적용에는 한계가 있었다. 이번 시간에는 ImageDataGenerator API를 이용하여 이미지 파일을 load하여 전처리 작업 후 모델의 학습에 사용하는 실습을 진행한다.
- CNN 모델을 이용하여 분류 분석 모델을 만든다.
- 앞선 Cat&Dog 데이터 셋(2개의 클래스)과 다르게 3개의 클래스로 구성되어 있다.
- 구글 AI 팀의 연구원 Laurence Moroney 이 딥러닝 교육용으로 수집한 데이터 셋
- 3000여 장의 300x300 픽셀의 24bit 컬러로 구성되어 있는 데이터셋
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 진행
- featue 이미지의 size를 (150, 150) 으로 resize 수행
- label 데이터는 one-hot-encoding 수행
"""
# 수강생 작성 코드
# 1. ImageDataGenerator API 를 이용하여 학습 데이터와 테스트 데이터를 읽어오기 위한 객체 생성
# - feature 데이터를 [0, 1] 사이로 scailing을 수행하세요
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255)
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=20,
shuffle=True,
class_mode='categorical')
test_generator = test_datagen.flow_from_directory(directory=test_dir,
target_size=(150, 150),
batch_size=20,
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.Dropout(0.3))
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=20, 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()
'프로젝트 > 코드프레소 체험단' 카테고리의 다른 글
이미지 데이터 처리를 위한 CNN 완벽 가이드 - Transfer Learning (0) | 2022.03.14 |
---|---|
이미지 데이터 처리를 위한 CNN 완벽 가이드 - DataAugmentation (0) | 2022.03.14 |
이미지 데이터 처리를 위한 CNN 완벽 가이드 - CNN 모델을 이용한 Cats & Dogs 분류 분석 (0) | 2022.03.10 |
이미지 데이터 처리를 위한 CNN 완벽 가이드 - ImageDataGenerator API (0) | 2022.03.08 |
이미지 데이터 처리를 위한 CNN 완벽 가이드 - CIFAR-10-codepresso 분류 CNN 모델 구현 (0) | 2022.03.07 |