- 정답지를 가지고 학습을 하는 딥러닝 및 머신러닝 알고리즘은 지도 학습(Supervised Learning)으로 분류됨
- 지도 학습에 있어서, 알고리즘의 성능을 향상시키기 위해선 수많은 정답지를 지닌 데이터가 존재해야만 함
- 하지만 현실에서는 학습에 사용할 데이터가 매우 적은 상황이 많음
- 이 때 데이터셋을 증강시켜주는 이미지 증강(Image Augmentation) 기법을 사용할 수 있음
- 이미지 증강 기법은 원본 이미지를 회전시키거나(rotate), 뒤집거나(flip), 자른다(cut)
- 데이터의 증가로 인해 모델의 학습이 더 잘될 수밖에 없음
- 이미지를 자르거나 섞는 방법으로 만들어진 새로운 이미지는 모델의 과적합(Overfitting)을 막아주는 중요한 역할을 함
- 또한 이미지 증강은 오직 학습 데이터셋에만 적용하는 것임
train_datagen = ImageDataGenerator(rescale=1./255,
horizontal_flip=True,
width_shift_range=0.1,
height_shift_range=0.1,
rotation_range=5,
shear_range=0.7,
zoom_range=1.2,
vertical_flip=True,
fill_mode='nearest')
- rescale : 주어진 이미지의 크기를 바꾸어 줌
- horizontal_flip, vertical_flip : 주어진 이미지를 수평 또는 수직으로 뒤집음
- zoom_range : 정해진 범위 안에서 축소 또는 확대함
- width_shift, height_shift : 정해진 범위 안에서 그림을 수평 또는 수직으로 랜덤하게 평행 이동시킴
- rotation_rang : 정해진 각도만큼 이미지를 회전시킴
- shear_range : 좌표 하나를 고정시키고 다른 몇 개의 좌표를 이동시키는 변환을 함
- fill_mode : 이미지를 축소 또는 회전하거나 이동할 때 생기는 빈 공간을 어떻게 채울지 결정함
(nearest 옵션을 선택하면 가장 비슷한 색으로 채워짐)
실습 : MRI 뇌 사진을 통한 치매 환자 예측
- MRI 뇌 사진을 보고 치매 환자의 뇌인지, 일반인의 뇌인지를 컨볼루션 신경망을 통해 예측해볼 것
- 이미지에 대한 증강 기법을 적용해볼 것
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation, Dropout, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras import optimizers
import numpy as np
import matplotlib.pyplot as plt
# 깃허브에 준비된 데이터를 가져옵니다.
!git clone https://github.com/taehojo/data-ch20.git
# 학습셋의 변형을 설정하는 부분입니다.
train_datagen = ImageDataGenerator(rescale=1./255, # 주어진 이미지의 크기를 설정합니다.
horizontal_flip=True, # 수평 대칭 이미지를 50% 확률로 만들어 추가합니다.
width_shift_range=0.1, # 전체 크기의 15% 범위에서 좌우로 이동합니다.
height_shift_range=0.1, # 마찬가지로 위, 아래로 이동합니다.
#rotation_range=5, # 정해진 각도만큼 회전시킵니다.
#shear_range=0.7, # 좌표 하나를 고정시키고 나머지를 이동시킵니다.
#zoom_range=1.2, # 확대 또는 축소시킵니다.
#vertical_flip=True, # 수직 대칭 이미지를 만듭니다.
#fill_mode='nearest' # 빈 공간을 채우는 방법입니다. nearest 옵션은 가장 비슷한 색으로 채우게 됩니다.
)
train_generator = train_datagen.flow_from_directory(
'./data-ch20/train', # 학습셋이 있는 폴더의 위치입니다.
target_size=(150, 150),
batch_size=5,
class_mode='binary')
# 테스트셋은 이미지 부풀리기 과정을 진행하지 않습니다.
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
'./data-ch20/test', # 테스트셋이 있는 폴더의 위치입니다.
target_size=(150, 150),
batch_size=5,
class_mode='binary')
# 앞서 배운 CNN 모델을 만들어 적용해 보겠습니다.
model = Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(150,150,3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(1))
model.add(Activation('sigmoid'))
model.summary()
# 모델 실행의 옵션을 설정합니다.
model.compile(loss='binary_crossentropy', optimizer=optimizers.Adam(learning_rate=0.0002), metrics=['accuracy'])
# 학습의 조기 중단을 설정합니다.
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=5)
# 모델을 실행합니다
history = model.fit(
train_generator,
epochs=100,
validation_data=test_generator,
validation_steps=10,
callbacks=[early_stopping_callback])
# 검증셋과 학습셋의 오차를 저장합니다.
y_vloss = history.history['val_loss']
y_loss = history.history['loss']
# 그래프로 표현해 봅니다.
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')
# 그래프에 그리드를 주고 레이블을 표시하겠습니다.
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
'빅데이터 분석가 양성과정 > Python - 딥러닝' 카테고리의 다른 글
설명가능한 딥러닝 모델 (2) | 2024.07.18 |
---|---|
전이 학습 (0) | 2024.07.18 |
오토인코더 (0) | 2024.07.18 |
비지도학습 신경망(GAN) (1) | 2024.07.18 |
순환신경망_재정리 및 추가 (1) | 2024.07.18 |