전이 학습(transfer learning) :
여러 방법 중에서 수 만장에 달하는 기존의 이미지에서 학습한 정보를 가져와 내 프로젝트에 활용하는 것
전이 학습을 하는 방법
- 먼저 대규모 데이터 셋에서 학습된 기존의 신경망을 불러옴
- CNN 모델의 앞쪽을 이 신경망으로 채움
- 뒤쪽 층에서 나의 프로젝트와 연결함
- 이 두 신경망이 잘 맞물리게끔 미세 조정(Fine tuning)을 하면 됨
전이학습 구조
transfer_model = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))
transfer_model.trainable = False
transfer_model.summary()
Fine-tuning(Transfer Learning)
- 이미 학습된 Neural Network를 새로운 Task에 맞게 다시 미세조정(Fine-Tuning)한다.
코드
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import Input, models, layers, optimizers, metrics
from tensorflow.keras.layers import Dense, Flatten, Activation, Dropout
from tensorflow.keras.applications import VGG16
from tensorflow.keras.callbacks import EarlyStopping
import numpy as np
import matplotlib.pyplot as plt
# 학습셋의 변형을 설정하는 부분입니다.
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')
# VGG16 모델을 불러옵니다.
transfer_model = VGG16(weights='imagenet', include_top=False, input_shape=(150, 150, 3))
transfer_model.trainable = False
transfer_model.summary()
# 우리의 모델을 설정합니다.
finetune_model = models.Sequential()
finetune_model.add(transfer_model)
finetune_model.add(Flatten())
finetune_model.add(Dense(64))
finetune_model.add(Activation('relu'))
finetune_model.add(Dropout(0.5))
finetune_model.add(Dense(1))
finetune_model.add(Activation('sigmoid'))
finetune_model.summary()
# 모델의 실행 옵션을 설정합니다.
finetune_model.compile(loss='binary_crossentropy', optimizer=optimizers.Adam(learning_rate=0.0002), metrics=['accuracy'])
# 학습의 조기 중단을 설정합니다.
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=5)
# 모델을 실행합니다.
history = finetune_model.fit(
train_generator,
epochs=20,
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 - 딥러닝' 카테고리의 다른 글
캐글 데이터 활용해보기 (0) | 2024.07.18 |
---|---|
설명가능한 딥러닝 모델 (2) | 2024.07.18 |
이미지 증강 (0) | 2024.07.18 |
오토인코더 (0) | 2024.07.18 |
비지도학습 신경망(GAN) (1) | 2024.07.18 |