Google tensorflow certification 05
Google Tensorflow Certification 05
Category 3 - 이미지 분류 모델 (CNN) - Type A
IDG(Image Data Gererator)
전처리(preprocess)과정에서,
이미지를 변형(Arguemenration)을 통해 Data set을 구성해주는 역할을 함
flow_from_driectory()함수를 이용해서 이미지를 불러올 때 폴더명에 맞춰서 자동으로 라벨링, 사이즈조절, 베치조절 등을 한다.
CNN(Convolution Neural Network) : 합성 곱 신경망
효율적인 연산을 위해이미지의 특성을 추출하는 필터를 통한 Feature Map을 생성함
Pooling Layer
이미지의 사이즈를 줄여주는 레이어
-
Max Pooling : 주변 픽셀 값 중, 최대값으로만 표시
-
Average Pooling : 주변 픽셀 값들의 평균값으로 표시
보통 CNN + Activation + Pooling 을 이용해서 모델을 쌓는다.
실습(RPS)
Step 1. Import
import urllib.request
import zipfile
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Dropout
# 레이어 설명은 아래에서
from tensorflow.keras.models import Sequential
from tensorflow.keras.callbacks import ModelCheckpoint t
from tensorflow.keras.preprocessing.image import ImageDataGenerator
Step 2. Preprocessing
# 전처리할 데이터 로드
url = 'https://storage.googleapis.com/download.tensorflow.org/data/rps.zip'
urllib.request.urlretrieve(url, 'rps.zip')
local_zip = 'rps.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('tmp/')
zip_ref.close()
# Data Set 경로 지정
TRAINING_DIR = "tmp/rps/" #flow_from_directory 함수에 의해 각 레이블(r,p,s)는 루트 폴더(tmp/rps)아레 폴더에 분류
# Image Data Generator 생성
training_datagen = ImageDataGenerator(
rescale=1. / 255, # 정규화(Normalization)
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',
validation_split=0.2 # rps data set에는 train data만 존제, 8:2 == train:valid 분할
)
대표적인 변형(Argumentation) 설정값
rescale
: 이미지의 픽셀 값을 조정rotation_range
: 이미지 회전width_shift_range
: 가로 방향으로 이동height_shift_range
: 세로 방향으로 이동shear_range
: 이미지 굴절zoom_range
: 이미지 확대horizontal_flip
: 횡 방향으로 이미지 반전fill_mode
: 이미지를 이동이나 굴절시켰을 때 빈 픽셀 값에 대하여 값을 채우는 방식validation_split
: validation set의 구성 비율
######
# IDG 적용 with flow_from_directory
training_generator = training_datagen.flow_from_directory(TRAINING_DIR, # root 폴더 경로
batch_size=32,
target_size=(150, 150),
class_mode='categorical', # 이진분류 X
subset='training', # IDG설정값 Validation_split존재
)
validation_generator = training_datagen.flow_from_directory(TRAINING_DIR,
batch_size=32,
target_size=(150, 150),
class_mode='categorical',
subset='validation',
)
Step 3. Modeling
model = Sequential([
Conv2D(64, (3, 3), activation='relu', input_shape=(150, 150, 3)), # 사이즈 150X150, RGB 3체널(컬러)
MaxPooling2D(2, 2), # 2X2 픽셀을 1픽셀로 (MaxPooling > 가장 큰 값)
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Conv2D(128, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Conv2D(128, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Flatten(), # 2D -> 1D With Flatten
Dropout(0.5), # 학습에 사용하는 Node 수 x0.5 > 과대적합 방지
Dense(512, activation='relu'),
Dense(3, activation='softmax'),# 분류(Classification) label이 3개 -> 이진분류X, activation = 'softmax'
])
#####
Step 4. Compile
# optimizer = 'adam' (분류 최적화는 adam이 가장 좋다(?))
# loss = 'sparse(원핫인코딩X)_categorical(모델 마지막 활성함수 Softmax)_crossentropy'
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
Step 4.5. ModelCheckpoint 생성
checkpoint_path = "my_checkpoint.ckpt" # 체크포인트 위치는 로컬, 이름.ckpt or 이름.m5
checkpoint = ModelCheckpoint(filepath=checkpoint_path,
save_weights_only=True, # 가중치만 저장
save_best_only=True, # 가장 좋은 결과만 저장
monitor='val_loss', # 기준 = 'validation_loss가 가장 낮은 것'
verbose=1) # 출력
Step 5. Fit
# 학습(train data, Validation_data, epochs, callbacks[ckpt])
epochs = 25
history = model.fit(training_generator, # IDG 적용 data set
validation_data=(validation_generator), # IDG 적용 data set
epochs=epochs,
callbacks=[checkpoint],
)
Step 5.5. Ckpt Load Weight
# 이 코드가 없다면, Ckpt 만드는 이유가 없음(가중치 저장만 해두고 사용 안하는 것)
model.load_weights(checkpoint_path)
댓글남기기