< Image Augmentation >
# 데이터 증강(Augmentation)은 기계 학습에서 널리 사용되는 기술 중 하나로, 기존의 데이터를 변형하거나 조작하여 새로운 데이터를 생성하는 과정을 말한다.
# 이는 모델의 일반화 성능을 향상시키고, 과적합을 줄이며, 데이터의 다양성을 증가시키는 데 사용
<예시를 통해서 코딩해 보자>
Cats v Dogs 로 다음처럼 모델링 하고, 학습시켜본다.
4 convolutional layers with 32, 64, 128 and 128 convolutions
train for 100 epochs
# 리눅스에서 이미지 파일을 불러오는 명령어 wget
# 구글은 리눅스 서버 환경임
!wget --no-check-certificate \
-O /tmp/cats_and_dogs_filtered.zip
--2024-04-18 07:34:00-- https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip Resolving storage.googleapis.com (storage.googleapis.com)... 142.251.2.207, 2607:f8b0:4023:c0d::cf, 2607:f8b0:4023:c03::cf Connecting to storage.googleapis.com (storage.googleapis.com)|142.251.2.207|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 68606236 (65M) [application/zip] Saving to: ‘/tmp/cats_and_dogs_filtered.zip’ /tmp/cats_and_dogs_ 100%[===================>] 65.43M 33.9MB/s in 1.9s 2024-04-18 07:34:02 (33.9 MB/s) - ‘/tmp/cats_and_dogs_filtered.zip’ saved [68606236/68606236]
# 파이썬을 이용해서 압축을 풀어야 한다
import zipfile
file = zipfile.ZipFile('/tmp/cats_and_dogs_filtered.zip')
# extractall('/tmp') 파라미터 안에 지정한 경로에 압축을 모두 풀어주는 명령어
file.extractall('/tmp')
base_dir = '/tmp/cats_and_dogs_filtered'
train_dir = '/tmp/cats_and_dogs_filtered/train'
val_dir = '/tmp/cats_and_dogs_filtered/validation'
import tensorflow as tf
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Flatten, Dense
def build_model() :
model = Sequential()
model.add( Conv2D(32, (3, 3), activation='relu', input_shape=(150, 150, 3)))
model.add( MaxPooling2D(2, 2))
model.add( Conv2D(64, (3, 3), activation='relu'))
model.add( MaxPooling2D(2, 2))
model.add( Conv2D(128, (3, 3), activation='relu'))
model.add( MaxPooling2D(2, 2))
model.add( Conv2D(128, (3, 3), activation='relu'))
model.add( MaxPooling2D(2, 2))
model.add(Flatten())
model.add( Dense(512, activation='relu'))
model.add( Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss= 'binary_crossentropy', metrics=['accuracy'])
return model
# 파일로 존재하는 데이터를, 메모리에 준비
# ImageDataGenerator 라이브러리를 이용하면 된다.
# 이 코드가, 파일을 넘파이로 바꿔서 메모리로 만드는 코드 : 피쳐 스케일링해서 (rescale=)
ImageDataGenerator(rescale= 1/255)
<keras.src.preprocessing.image.ImageDataGenerator at 0x792538e75b70>
# 이미지 증강까지 해서 메모리에 데이터 생성하는 방법 : 파라미터안에 코드를 추가한다
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')
# target_size는 위에서 만든 모델의 input_shape과 일치해야 한다. 행과 열만 rgb값은 상관없다.
train_generator = train_datagen.flow_from_directory(train_dir,
target_size=(150, 150),
class_mode= 'binary')
Found 2000 images belonging to 2 classes.
# X_train, y_train => train_generator 는 두개의 train 정보를 다 가지고 있다.
val_datagen = ImageDataGenerator(rescale= 1/255)
val_generator = val_datagen.flow_from_directory(val_dir,
target_size= (150, 150),
class_mode= 'binary')
Found 1000 images belonging to 2 classes.
# 학습중에 얼리스탑 시키기 위해 파라미터에 넣을 변수 생성
early_stop = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)
# train_generator이 두개의 train을 다 가지고 있기 때문에 이것 한개만 적어주면 된다.
epoch_history = model.fit(train_generator,
epochs=20,
validation_data= val_generator,
callbacks= [early_stop])
ㄴ 학습진행에 시간이 소요된다.
다음게시글에 이어서 추가 학습후에 예측까지 진행해 보자.