04. Transfer Learning - Feature Extraction
(참고) udemy - TF Developer in 2022
Contents
- Using GPU
- Transfer Learning with TF Hub
- Callbacks
- Create models using TF Hub
- Comparing Models using TensorBoard
(1) Using GPU
!nvidia-smi
(2) Transfer Learning with TF Hub
- 유명한 모델 component들 담고 있는 repositorh
- 간단히 import 해서 URL 식으로 사용 가능
(3) Callbacks
Callbacks
- 모델이 학습 중에 이루어지는 것들
종류
- (1) Experiment Tracking with TENSORBOARD
- (2) Model checkpointing
- 중간 중간에 모델 weight 저장
- (3) Early Stopping
TensorBoard
tf.keras.callbacks.TensorBoard()
- 모델의 performance들을 저장하는 경로 :
[dir_name]/[experiment_name]/[current_timestamp]
import datetime
def TB_callback(dir_name, experiment_name):
log_dir = dir_name + "/" + experiment_name + "/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = tf.keras.callbacks.TensorBoard(
log_dir=log_dir
)
print(f"Saving TensorBoard log files to: {log_dir}")
return tensorboard_callback
(4) Create models using TF Hub
TF Hub로부터, 아래의 2개의 pre-trained model을 사용할 것
- ResNetV2 ( 2016 )
- EfficientNet ( 2019 )
Steps
- tfhub.dev 에 접속
- 풀고자하는 task 도메인 선택 ( ex. image )
- TF 버전 선책
- 풀고자하는 문제 제외한 Problem Domain 전부 체크 해제
- 이때 뜨는 모델들이 선택 가능한 모델 후보들
- 좌측의 Architecture Tab 클릭
- 특정 모델 ( EfficientNetB0 ) 클릭
- Copy URL
- https://tfhub.dev/tensorflow/efficientnet/b0/feature-vector/1
Feature Extraction Transfer Learning
- pre-trained model이 학습했던 패턴(weight)을 그대로 사용
- 본인 문제에 적합한 output으로 adjust
Fine-tuning Transfer Learning
- pre-trained model이 학습했던 패턴(weight)을 가져와서, 일부 layer를 본인에 문제에 맞게 약간 살짝쿵 (fine) 튜닝
- Import Packages
import tensorflow as tf
import tensorflow_hub as hub
from tensorflow.keras import layers
- Import URLs
# Resnet 50 V2 feature vector
resnet_url = "https://tfhub.dev/google/imagenet/resnet_v2_50/feature_vector/4"
# Original: EfficientNetB0 feature vector (version 1)
efficientnet_url = "https://tfhub.dev/tensorflow/efficientnet/b0/feature-vector/1"
- Build Model
- argument :
- (1) model의 URL
- (2) 내 task에 맞는 output 종류 수
def create_model(model_url, num_classes=10):
FE_layer = hub.KerasLayer(model_url,
trainable=False, # freeze 여부
name='feature_extraction_layer',
input_shape=IMAGE_SHAPE+(3,)) # 나의 input image shape
model = tf.keras.Sequential([
FE_layer, # back bone으로 위의 FE layer 사용
layers.Dense(num_classes, activation='softmax', name='output_layer') # 내 task에 맞는 output layer
])
return model
resnet_model = create_model(resnet_url, num_classes=train_data_10_percent.num_classes)
resnet_model.compile(loss='categorical_crossentropy',
optimizer=tf.keras.optimizers.Adam(),
metrics=['accuracy'])
- Train Model
- 이때, callbacks에 tensorboard를 생성하는 함수를 넣는다.
# Fit the model
resnet_history = resnet_model.fit(train_data_10_percent,
epochs=5,
steps_per_epoch=len(train_data_10_percent),
validation_data=test_data,
validation_steps=len(test_data),
callbacks=[create_tensorboard_callback(dir_name="tensorflow_hub",
experiment_name="resnet50V2")])
( 위와 유사하게, EfficientNet도 불러와서 사용한다 )
(5) Comparing Models using TensorBoard
모델의 학습 로그들이 모두 자동으로 저장되었다 ( 위에서 callbacks에서 지정해줬으므로 )
이것들을 시각화하여 확인하기 위해, TensorBoard.dev 에 업로드해야 한다.
!tensorboard dev upload --logdir ./tensorflow_hub/ \
--name "EfficientNetB0 vs. ResNet50V2" \
--description "Comparing two different TF Hub feature extraction models architectures using 10% of training images" \
--one_shot
-
--logdir
: target upload directory -
--name
: name of experiment -
--description
: brief description of experiment -
--one_shot
: exits the TensorBoard uploader once uploading is finished
TensorBoard에 올렸던 모든 experiment들 확인하기
!tensorboard dev list
TensorBoard에 올라와있는 experiment 제거하기
tensorboard dev delete --experiment_id [INSERT_EXPERIMENT_ID]