Machine Learning/TensorFlow

[Machine Learning] Model Save & Load

데이터 세상 2021. 3. 3. 13:16
728x90
반응형
  • 학습: 데이터 -> 학습 -> 시험
  • 테스트(inference): 데이터 -> 시험

모델 저장 목적

  • 모델 작업 중단되더라도 해당 부분부터 재 시작
  • 저장된 모델을 공유
  • 공유받은 모델을 활용해 모델 정확도와 효율성을 향상시켜 더 나은 모델 만들 수 있음

Model Save

  • 데이터 -> 학습 -> 시험의 단계에서 학습 완료 모델을 저장
  • model.save('path/to/location') or tf.keras.models.save_model()
    • 파일 확장자: h5, hdf5, 파일의 확장자만 다를 뿐 동일, 성능 차이가 거의 없음
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder

"""
데이터 입력/분류
"""
df = pd.read_csv('../dataset/sonar.csv',header=None)
## 데이터 분류
dataset = df.values
X = dataset[:,0:60].astype(float)
Y_obj = dataset[:,60]

# one-hot encoding: 문자열을 숫자로 변환
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)

# 전체 데이터에서 학습 데이터와 테스트 데이터로 구분, shuffle=True로 하면 데이터를 섞어서 나눔
X_train1, X_test, Y_train1, Y_test = train_test_split(X, Y, test_size=0.2,shuffle=True)  
## 학습 셋에서 학습과 검증 데이터로 구분
X_train, X_valid, Y_train, Y_valid = train_test_split(X_train1, Y_train1, test_size=0.2, shuffle=True) 


"""
모델 설계
"""
activation=tf.keras.activations.sigmoid
input_Layer = tf.keras.layers.Input(shape=(60,))
x = tf.keras.layers.Dense(120, activation=activation)(input_Layer)
x = tf.keras.layers.Dense(100, activation=activation)(x)
x = tf.keras.layers.Dense(50, activation=activation)(x)
Out_Layer= tf.keras.layers.Dense(1, activation='sigmoid')(x)

model = tf.keras.models.Model(inputs=[input_Layer], outputs=[Out_Layer])
model.summary()


"""
모델 LOSS 함수 및 최적화 함수 할당
"""
## 모델 설정: loss 함수, 학습 방법 결정
# 예측값 과 정답의 오차값 정의. 
# binary_crossentropy는 0 or 1을 정답으로 가질때 croossentropy 함수를 사용한 loss함수
loss = tf.keras.losses.binary_crossentropy
# 경사 하강법으로 global min 에 찾아가는 최적화 방법 선언.
optimizer = tf.keras.optimizers.SGD(lr=0.01)
# 학습하면서 평가할 메트릭스 선언
metrics=tf.keras.metrics.binary_accuracy

## 모델 컴파일
# 모델 및 loss 등 구조화한 모델을 컴퓨터가 동작 할수 있도록 변환
model.compile(loss=loss, optimizer=optimizer, metrics=[metrics])


"""
모델 학습
"""
# validation_data=(X_valid,Y_valid)을 추가하여 학습시 검증을 해줌.
model.fit(X_train, Y_train, epochs=50, batch_size=50, validation_data=(X_valid,Y_valid)) 


"""
학습 완료 후 모델 저장
"""
model.save('test_model.h5')

 

Model Load / Model Re-Train

  • 데이터 -> 학습 -> 시험의 단계에서 학습 단계에서 저장된 모델 불러와서 시험 진행
  • model.load('path/to/location') or tf.keras.models.load_model('path/to/location')
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder

"""
데이터 입력/분류
"""
df = pd.read_csv('../dataset/sonar.csv',header=None)
## 데이터 분류
dataset = df.values
X = dataset[:,0:60].astype(float)
Y_obj = dataset[:,60]

# one-hot encoding: 문자열을 숫자로 변환
e = LabelEncoder()
e.fit(Y_obj)
Y = e.transform(Y_obj)

# 전체 데이터에서 학습 데이터와 테스트 데이터로 구분, shuffle=True로 하면 데이터를 섞어서 나눔
X_train1, X_test, Y_train1, Y_test = train_test_split(X, Y, test_size=0.2,shuffle=True)  
## 학습 셋에서 학습과 검증 데이터로 구분
X_train, X_valid, Y_train, Y_valid = train_test_split(X_train1, Y_train1, test_size=0.2, shuffle=True) 


"""
모델 불러오기(모델+weight)
"""
model = tf.keras.models.load_model('test_model.hdf5')


"""
모델 LOSS 함수 및 최적화 함수 할당
"""
## 모델 설정: loss 함수, 학습 방법 결정
loss = tf.keras.losses.binary_crossentropy
optimizer = tf.keras.optimizers.SGD(lr=0.01)
metrics=tf.keras.metrics.binary_accuracy

## 모델 컴파일
model.compile(loss=loss, optimizer=optimizer, metrics=[metrics])


"""
모델 학습
"""
# validation_data=(X_valid,Y_valid)을 추가하여 학습시 검증을 해줌.
model.fit(X_train, Y_train, epochs=50, batch_size=50, validation_data=(X_valid,Y_valid)) 

 

Callback 함수

  • 학습 중에 모델을 저장하거나 제어하고 싶을 때 사용
  • 훈련하는 동안 모델 내부에서 일어나는 일을 조사하고 제어할 수 있는 함수
  • 모델 fit() 메서드가 호출될 때 전달되는 객체
  • 훈련하는 동안 모델은 여러 지점에서 callback 호출
  • 모델의 상태와 성능에 대한 모든 정보에 접근하고 훈련중지, 모델저장, 모델 상태 변경 등이 가능

Model Check Point 저장

  • 훈련하는 동안 어떤 지점에서 모델의 현재 가중치 저장
  • keras.callbacks.ModelCheckpoint(filepath = , monitor = , verbose = , save_best_only)
    • filepath: 저장할 주소
    • monitor: save_best_only가 True일 때 monitor 지정값을 기준으로 저장
    • verbose: 1일 경우 저장할 때 model 저장했다고 print 해줌
    • ex) monitor='val_loss', save_best_only=True일 경우 2번째 epoch에서 val_loss가 0.5로 저장했다면 epoch 돌면서 val_loss가 0.5보다 적은 epoch에서 모델저장. 즉 마지막 저장 모델은 가장 작은 val_loss일 때 모델 저장됨

Early Stop

  • 검증 손실이 더 이상 향상되지 않을 때 훈련 중지
  • keras.callbacks.EarlyStopping(monitor=, patience = )
    • monitor에 지정한 값을 보면서 지정된 patience 동안 성능 향상이 없으면 학습 중단

Learning Rate Schedule

  • 훈련하는 동안 하이퍼 파라미더 값을 동적으로 조정(optimize 학습률 자동 조정)
  • keras.callbacks.LearningRateScheduler(step_decay, verbose=)
    • step_decay: Learning Rate을 정의된 함수로 조정
    • verbose: 1일 때, learning_rate 값이 학습하면서 print 됨

keras.callbacks.ReduceLROnPlateau

keras.callbacks.CSVLogger

 

TensorBoard

  • 학습 과정을 그래픽적으로 확인할 수 있는 기능
  • keras.callbasck.TensorBoard(log_dir=, histogram_freq=)
    • log_dir: 학습의 과정이 저장되는 폴더 이름, 저장파일을 cmd에서 동작
    • histogram_freq: 모델 레이어의 활성화 및 가중치 히스토그램 계산 빈도(epoch 단위)
import tensorflow as tf
from datetime import datetime

# Tensorboard에서 Scalar값 추가를 위해 file writer 선언
logdir = "log_dir/scalars/" + datetime.now().strftime("%Y%m%d-%H%M%S")
file_writer = tf.summary.create_file_writer(logdir + "/metrics")
file_writer.set_as_default()


def step_decay(epoch):
    initial_lrate = 0.1
    drop = 0.5
    epochs_drop = 10.0
    lrate = initial_lrate * math.pow(drop, math.floor((1+epoch)/epochs_drop))
	
    # 원하는 scalar 값 추가	
    tf.summary.scalar('lr',data=lrate,step=epoch)
    
    return lrate
    
    
modelpath="./best_model/{epoch:02d}-{val_loss:.4f}.h5"
callbacks_list =
[
	tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=100),
	tf.keras.callbacks.ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True),
	tf.keras.callbacks.LearningRateScheduler(step_decay,verbose=1),
	tf.keras.callbacks.TensorBoard(log_dir=logdir, histogram_freq=1)    
]

model.fit(X_train, Y_train, epochs=50, batch_size=50, validation_data=(X_valid,Y_valid), callbacks=callbacks_list)

Tensorboard 실행

# 실행 경로에서 Terminal에 다음 명령 실행
tensorboard --logdir=./log_dir

>>
Serving TensorBoard on localhost; to expose to the network, use a proxy or pass --bind_all
TensorBoard 2.0.0 at http://localhost:6006/ (Press CTRL+C to quit)

>>
Chrome browser에서 주소(http://localhost:6006/) 복사 후 실행

 


Reference

728x90
반응형