728x90
반응형
ImageDataGenerator
Keras에서 이미지 파일을 쉽게 전처리하여 학습시킬 수 있도록 제공해주는 클래스이다.
뿐만 아니라 이미지 데이터에 여러 변형을 주어 원래 있는 학습 데이터셋보다 더 많은 양의 데이터를 학습시키는 것과 같은 효과를 낼 수 있는 이미지 증강(Image Argumentation)도 가능하게 해준다.
- 불러오기
import tensorflow as tf
from tensorflow import keras
from keras.preprocessing.image import ImageDataGenerator
- ImageDataGenerator() 인스턴스 생성
train_datagen = ImageDataGenerator(
rescale=1. / 255, # 이미지의 픽셀 값을 조정 (0-1 범위로 변환 -> MinMaxScaling)
validation_split=0.2, # 이미지 회전
# 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 set의 구성 비율
)
[ generator 생성 ]
- flow_from_directory() : 디렉토리 내부의 이미지 데이터들을 공급해준다.
- 지정된 디렉토리의 내부에는 각 클래스의 이름으로 된 폴더별로 해당하는 이미지가 나뉘어진 상태여야 한다.
- train / validation set 의 generator를 각각 정의한다.
## train_genrator 생성
train_generator = train_datagen.flow_from_directory(
TRAIN_PATH, # 이미지 폴더 경로
batch_size=BATCH_SIZE,,
target_size=(img_height, img_width), # 이미지를 지정된 타겟 사이즈 만큼 알아서 잘라서 공급해준다.
class_mode='categorical',
subset='training'
)
# Found 3459 images belonging to 4 classes.
# ==> 4가지 종류의 클래스로 라벨링된 3459개의 이미지
## validation_generator 생성
validation_generator = train_datagen.flow_from_directory(
TRAIN_PATH,
batch_size=BATCH_SIZE,
target_size=(img_height, img_width), # train_generator의 target_size와 같아야한다.
class_mode='categorical',
subset='validation'
)
# Found 864 images belonging to 4 classes.
[ 모델링 ]
input_shape = (img_height, img_width, 3) # 480, 854, 3
# 1. 세션 클리어
clear_session()
# 2. 모델 선언
model = Sequential()
# 3. 레이어 쌓기
model.add( Input(shape=input_shape) )
model.add( Conv2D(filters=64,
kernel_size=(3,3),
activation='relu',
padding='same',
) )
model.add( MaxPool2D(pool_size=(2,2),
strides=(2,2)) )
model.add( BatchNormalization() )
model.add( Dropout(0.2) )
model.add( Flatten() )
model.add( Dense(4, activation='softmax') )
# 4. 컴파일
model.compile(loss=keras.losses.categorical_crossentropy, metrics=['accuracy'], optimizer=keras.optimizers.Adam())
# 모델링 정보 확인
model.summary()
[ 학습 ]
callback함수 중 EarlyStopping 말고도 ModelCheckpoint를 사용해줄 수 있다.
두가지를 모두 사용해서 학습시켜보았다.
ModelCheckpoint
: 모델의 학습 중간중간 모델의 가중치를 저장해주는 콜백함수
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
- 가중치 저장 경로 지정
filename = MODEL_PATH + '/checkpoint-epoch-{}-batch-{}-trial-001.h5'.format(EPOCH, BATCH_SIZE)
- 콜백함수 선언
checkpoint = ModelCheckpoint(
filepath=filename, # 파일명 지정
monitor='val_loss', # val_loss값이 개선되었을 때 호출
verbose=1, # 로그 출력
save_best_only=True, # 가장 best 모델만 저징
mode='auto' # 알아서 best를 찾는다.
)
# early_stopping
es = EarlyStopping(
monitor='val_loss',
min_delta=0,
patience=5,
verbose=1,
restore_best_weights=True
)
- 모델 학습
- generator 데이터로 학습을 시킬땐 fit_generator()를 사용해서 학습시켜준다.
근데 써보니까 이제 fit으로 쓰라는것 같은데 찾아볼 시간이 없어서 일단 이대로 썼다.
# 모델 학습
history = model.fit_generator(
train_generator,
steps_per_epoch=20,
epochs=EPOCH,
validation_data=validation_generator,
validation_steps=10,
callbacks=[es, checkpoint]
)
학습이 끝난 뒤 지정한 경로로 best 성능의 모델이 저장된 것을 볼 수 있다.
마지막에만 저장해주는 것이 아니라 각각의 epoch마다 그 시점 기준으로 가장 성능이 좋았던 모델을 수시로 저장해주기 때문에 중간에 학습이 끊기는 경우에도 가중치를 다시 불러와 학습할 수 있다.
저장된 가중치를 모델로 불러오고 그 모델을 저장해보자
# best 가중치의 경로
checkpoint_filepath = '/content/drive/MyDrive/KT_AIVLE_SCHOOL/11주차_미니프로젝트_3차/AIVLE3rd_individual/model/checkpoint-epoch-200-batch-16-trial-001.h5'
# best 가중치 모델로 불러오기
model.load_weights(checkpoint_filepath)
- 모델 저장
model.save(filepath=MODEL_PATH+'/model1.h5')
728x90
반응형
'인공지능 AI' 카테고리의 다른 글
모델 저장 및 불러오기 - Joblib, keras (0) | 2022.11.18 |
---|---|
Pytorch 기본 사용법 (0) | 2022.10.10 |
[ OpenCV로 동영상 불러오기, glob ] (0) | 2022.09.26 |
[ LightGBM ] (0) | 2022.09.11 |
[ 정규화 : RobustScaler ] (0) | 2022.09.10 |