본문 바로가기
Naver Clould with BitCamp/Aartificial Intelligence

Save model and weights

by HJ0216 2023. 1. 24.

기본 환경: IDE: VS code, Language: Python

 

1. Save model and weights

# save_model_and_weights.py

import numpy as np

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.metrics import mean_squared_error, r2_score

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.callbacks import EarlyStopping

# Model save
path = './_save/' # ./ 현재(STUDY) dir
# path = '../_save/' # ../ 상위 dir
# path = 'c:/study/_save/' # 경로 대소문자 구분 X


# 1. Data
dataset = load_boston()
x = dataset.data # for training
y = dataset.target # for predict

x_train, x_test, y_train, y_test = train_test_split(
    x, y,
    train_size=0.7,
    random_state=123
)

scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)


# 2. Model(Function)
input1 = Input(shape=(13,))
dense1 = Dense(64, activation='relu')(input1)
dense2 = Dense(32, activation='relu')(dense1)
output1 = Dense(1, activation='linear')(dense2)
model = Model(inputs=input1, outputs=output1)

# save model before training
model.save(path+'save_model1.h5')
# save weights before training(훈련이 되지 않은 가중치이므로 사용X)
model.save_weights(path +'save_weights1.h5')

# 3. compile and train
model.compile(loss='mse', optimizer='adam', metrics=['mae'])
earlyStopping = EarlyStopping(monitor='val_loss', mode='min', patience=32, restore_best_weights=True, verbose=1)
hist = model.fit(x_train, y_train,
          epochs=512,
          batch_size=16,
          validation_split=0.2,
          callbacks=[earlyStopping],
          verbose=1)

# save model and weight after training
model.save(path+'save_model2.h5')
# save weights after training
model.save_weights(path+'save_weights2.h5')


# 4. evaluate and predict
loss = model.evaluate(x_test, y_test)
y_predict = model.predict(x_test)

def RMSE (y_test, y_predict):
    return np.sqrt(mean_squared_error(y_test, y_predict))
print("RMSE: ", RMSE(y_test, y_predict))

r2 = r2_score(y_test, y_predict)
print("R2: ", r2)



'''
Result
RMSE:  4.122959900727362
R2:  0.7896919500228364

'''

* 훈련 전

- model.save(path+'save_model1.h5')

: model 및 weights 저장

: ⚠️ 훈련 전이므로 저장된 weights는 사용 X
- model.save_weights(path +'save_weights1.h5')

: weights 저장

: ⚠️ 훈련 전이므로 저장된 weights는 사용 X

 

** 훈련 후

- model.save(path+'save_model2.h5')

: model 및 weights 저장

model.save_weights(path+'save_weights2.h5')

: weights 저장

 

2. Load model and weights

# load_model_and_weights.py

import numpy as np

from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.metrics import mean_squared_error, r2_score

from tensorflow.keras.models import Sequential, Model, load_model
from tensorflow.keras.layers import Dense, Input

# saved model path
path = './_save/' # ./ 현재(STUDY) dir
# path = '../_save/' # ../ 상위 dir
# path = 'c:/study/_save/' # 경로 대소문자 구분 X


# 1. Data
dataset = load_boston()
x = dataset.data # for training
y = dataset.target # for predict

x_train, x_test, y_train, y_test = train_test_split(
    x, y,
    train_size=0.7,
    random_state=123
)

# scaler = StandardScaler()
scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)


# 2. Model(Function)
model = load_model(path+'save_model1.h5')
# save_model1.h5와 동일한 모델 구성 반환
# Model Construction 생략 가능


# 3. compile and train
model = load_model(path + 'save_model2.h5')
# save_model2.h5와 동일한 모델 구성 및 가중치 반환
# Model construction, compile and train 생략 가능


# 4. evaluate and predict
loss = model.evaluate(x_test, y_test)
y_predict = model.predict(x_test)

def RMSE (y_test, y_predict):
    return np.sqrt(mean_squared_error(y_test, y_predict))
print("RMSE: ", RMSE(y_test, y_predict))

r2 = r2_score(y_test, y_predict)
print("R2: ", r2)



'''
Result
RMSE:  4.122959900727362
R2:  0.7896919500228364

'''

* 훈련 전

- model = load_model(path+'save_model1.h5')

: 저장된 model 및 weights 불러오기

⚠️ 훈련 전이므로 저장된 weights는 무의미
- model.load_weights(path + 'save_weights1.h5')

: 저장된 weights 불러오기

⚠️ weights를 가져왔으므로 fit 필요없으나, 훈련 전 저장된 weights 무의미

 

** 훈련 후

- model = load_model(path + 'save_model2.h5')

: 저장된 model 및 weights 불러오기

- model.load_weights(path + 'save_weights2.h5')

: 저장된 weights 불러오기

⚠️ RuntimeError: You must compile your model before training/testing. Use `model.compile(optimizer, loss)`.
⚠️ 가중치만 저장(Model 및 Compile 저장 X) -> 모델 구성 후 compile 필요

 

 

➕ weight만 따로 save 하는 이유
→ 큰 모델의 모델 및 가중치 저장 시, 파일의 크기가 큼(불러오기에서 문제가 발생할 가능성 존재)

 사이즈가 상대적으로 작은 훈련 결과 가중치만 저장하여 안전하게 불러오기

 

파일 확장자 .h5와 .hdf5

.h5 = .hdf5

HDF5는 Hierarchical Data Format이며 self-describing이 되는 고성능 데이터포맷 또는 DB 

HDF5 파일을 생성하면 먼저 /라는 루트 그룹이 생성되고 그 하위에 트리 구조로 다른 그룹을 생성할 수 있음

그룹 하위에 다른 그룹이 있을 수도 있고, 데이터셋이 존재할 수도 있으며 운영체계의 디렉토리-파일 구조와 일치 

 

 

 

소스 코드

🔗 HJ0216/TIL

 

참고 자료

📑 7.1 HDF5의 특징