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
반응형
'Machine Learning > TensorFlow' 카테고리의 다른 글
Deep Learning Framework (0) | 2021.03.10 |
---|---|
[Machine Learning] Neural Network MNIST 데이터 처리 (0) | 2021.03.04 |
[Machine Learning] TensorFlow with Keras (0) | 2021.03.02 |
[Machine Learning] TensorFlow Function (0) | 2021.02.27 |
[Machine Learning] TensorFlow Matrix (0) | 2021.02.27 |