전이학습
전이 학습은 훨씬 더 많은 데이터에 대해 학습 된 기존 모델을 가져와 해당 데이터에서 모델이 학습한 기능을 사용하여 문제에 사용하는 딥 러닝의 개념
모델의 모든 계층을 훈련하는 대신 전이 학습에서 일부 계층을 잠그고 잠긴 계층에서 훈련된 가중치를 사용하여 데이터에서 특정 특징을 추출, 하위 레이어에서 일부를 재교육하기 위해 선택할 수 있는 모든 레이어를 안 잠궈도됨
VGG16의 Keras에서 구현된 전이 학습(transfer learning)
VGG모델을 이용한 새로운 이미지 분류
VGG16 → 16-layer, VGG19 → 19-layer version 제공
데이터 준비
image=img_to_array(image)
image=image.reshape(1,image.shape[0], image.shape[1], image.shape[2])
모델 생성- 사전 훈련된 가중치 불러오기
from keras.applications.vgg16 import VGG16
model = VGG16()
# model = VGG16(weights='imagenet', include_top=True)
# VGG16보다 resnet이 더 성능이 좋다.
import keras,os
from keras.models import Sequential
from keras.layers import Dense, Conv2D, MaxPool2D , Flatten
from keras.preprocessing.image import ImageDataGenerator
import numpy as np
trdata = ImageDataGenerator()
traindata = trdata.flow_from_directory(directory="data",target_size=(224,224))
tsdata = ImageDataGenerator()
testdata = tsdata.flow_from_directory(directory="test", target_size=(224,224))
https://towardsdatascience.com/step-by-step-vgg16-implementation-in-keras-for-beginners-a833c686ae6c
모델 구조 확인
model.summary()
image=preprocess_input(image)
yhat=model.predict(image)
label=decode_predictions(yhat)
label=label[0][0]
EarlyStopping
from keras.callbacks import ModelCheckpoint, EarlyStopping
checkpoint = ModelCheckpoint("vgg16_1.h5",
monitor='val_acc', verbose=1, save_best_only=True,
save_weights_only=False, mode='auto', period=1)
early = EarlyStopping(monitor='val_acc',
min_delta=0, patience=40, verbose=1, mode='auto')
model.fit_generator(generator= traindata, steps_per_epoch= 2,
epochs= 100, validation_data= testdata, validation_steps=1,
callbacks=[checkpoint,early])
model.save_weights("vgg16_1.h5")
epoch 5정도로 해볼 것
ResNet
레이어가 깊다고 마냥 좋진 않다.
Residual Block : shortcut이 존재한다.
기존 신경망 : x로 y를 매핑하는 함수 H(x) 를 얻는 것이 목적
ResNet : F(x) + x 를 최소화 하는 것이 목적 ,
x는 변경 불가이므로 F(x)를 0에 가깝게 만드는 것이 목적
→ F(x) == 0 이 되면, input and output이 모두 x로 같아지게 된다.
→ F(x)=H(x) - x 이므로 → F(x)를 최소 == H(x) -x 를 최소
(H(x) - x : 를 잔차residual 라고 한다, 잔차를 최소)
VGG-19의 구조를 뼈대로 + convoulution layer를 add하여 깊게 만든 후 → shortcut add.
깊은 구조일 수록 좋다. (shortcut을 연결하여)