🔥알림🔥
① 테디노트 유튜브 -
구경하러 가기!
② LangChain 한국어 튜토리얼
바로가기 👀
③ 랭체인 노트 무료 전자책(wikidocs)
바로가기 🙌
④ RAG 비법노트 LangChain 강의오픈
바로가기 🙌
⑤ 서울대 PyTorch 딥러닝 강의
바로가기 🙌
[tensorflow] VGG16 Transfer Learning 구현과 CNN 모델과 성능 비교
Tranfer Learning은 사전 학습된 모델을 활용하는 방법입니다. 사전 학습된 모델은 방대한 데이터에 대하여 이미 학습된 모델이기 떄문에 적은 학습 cost로 좋은 성능을 이끌어 낼 수 있습니다.
이번 포스팅에서는 사전 학습된 VGG-16 모델을 활용하는 방법에 대하여 알아보고, 일반 CNN 모델과의 성능 비교를 해보겠습니다.
Import
import tensorflow_datasets as tfds
import tensorflow as tf
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Flatten, Dropout
from tensorflow.keras.models import Sequential
from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.applications import VGG16
from IPython.display import Image
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Hyperparameter 정의
BATCH_SIZE
와 EPOCHS
를 정의합니다.
BATCH_SIZE = 64
EPOCHS = 20
dataset_name = 'cats_vs_dogs'
(train_dataset, validation_dataset), info = tfds.load(name=dataset_name, split=('train[:80%]', 'train[-20%:]'), with_info=True)
len(list(train_dataset)), len(list(validation_dataset))
이미지에 대한 Normalize를 진행합니다.
def normalize(images):
# 0~1 사이의 값으로 Normalize 합니다.
img, lbl = tf.cast(images['image'], tf.float32) / 255.0, images['label']
# 300 X 300 사이즈로 resize 합니다.
img = tf.image.resize(img, size=(300, 300))
return img, lbl
normalize
를 수행합니다.
Training Set
와 Validation Set
을 만들고 BATCH_SIZE에 따라 mini batch를 만듭니다.
train_data = train_dataset.map(normalize).batch(BATCH_SIZE).repeat().prefetch(1)
valid_data = validation_dataset.map(normalize).batch(BATCH_SIZE).repeat().prefetch(1)
steps_per_epoch
과 validation_steps
를 정의하여 train 합니다.
steps_per_epoch= int(len(list(train_dataset)) * 0.8) // BATCH_SIZE + 1
validation_steps= int(len(list(validation_dataset)) * 0.2) // BATCH_SIZE + 1
Convolution Neural Network
model_cnn = Sequential([
Conv2D(32, (3, 3), activation='relu', input_shape=(300, 300, 3)),
MaxPooling2D(2, 2),
Conv2D(32, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Conv2D(64, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Conv2D(128, (3, 3), activation='relu'),
MaxPooling2D(2, 2),
Flatten(),
Dense(512, activation='relu'),
Dense(32, activation='relu'),
Dense(1, 'sigmoid')
])
model_cnn.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
cnn_history = model_cnn.fit(train_data,
validation_data=(valid_data),
steps_per_epoch=steps_per_epoch,
validation_steps=validation_steps,
epochs=20,
)
Transfer Learning (VGG 16)
VGG-16은 ImageNet 데이터베이스의 1백만 개가 넘는 영상에 대해 훈련된 컨벌루션 신경망입니다. 이 네트워크에는 16개의 계층이 있으며, 영상을 키보드, 마우스, 연필, 각종 동물 등 1,000가지 사물 범주로 분류할 수 있습니다. 그 결과 이 네트워크는 다양한 영상을 대표하는 다양한 특징을 학습했습니다.
VGG-16모델을 활용하여 Transfer Learning 을 진행합니다.
Image('https://s3.ap-south-1.amazonaws.com/techleer/309.jpg')
transfer_model = VGG16(weights='imagenet', include_top=False, input_shape=(300, 300, 3))
transfer_model.trainable=False
model_tr = Sequential([
transfer_model,
Flatten(),
Dense(64, activation='relu'),
Dense(1, 'sigmoid')
])
model_tr.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
transfer_history = model_tr.fit(train_data,
validation_data=(valid_data),
steps_per_epoch=steps_per_epoch,
validation_steps=validation_steps,
epochs=20,
)
성능 Visualization
Losses 와 Accuracy를 보면, Transfer Learning 모델이 훨씬 초기 수렴이 빠를 뿐더러, 최종 성능도 accuracy 기준 약 10% 가량 우수하다는 것을 확인할 수 있습니다.
plt.figure(figsize=(12, 10))
plt.plot(np.arange(1, EPOCHS+1), cnn_history.history['val_loss'], label='CNN')
plt.plot(np.arange(1, EPOCHS+1), transfer_history.history['val_loss'], label='TRANSFER')
plt.xlabel('EPOCHS')
plt.ylabel('LOSSES')
plt.title('LOSSES')
plt.legend()
plt.show()
plt.figure(figsize=(12, 10))
plt.plot(np.arange(1, EPOCHS+1), cnn_history.history['val_accuracy'], label='CNN')
plt.plot(np.arange(1, EPOCHS+1), transfer_history.history['val_accuracy'], label='TRANSFER')
plt.xlabel('EPOCHS')
plt.ylabel('LOSSES')
plt.title('LOSSES')
plt.legend()
plt.show()
댓글남기기