Artificial Intelligence/Deep Learning

[DL] model save / checkpoint

inee0727 2022. 7. 7. 15:36

훈련 전 모델 저장 / 불러오기 (model=load.model)

1. 훈련하기 전의 가중치
2. 모델구성한 다음 save weights 하면 훈련하기 전의 가중치가 불러와지기 때문에 데이터가 엉망이다.

import numpy as np 
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import r2_score
from sklearn.preprocessing import MinMaxScaler

#1.데이터
datasets = load_boston()
x = datasets.data
y = datasets.target

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

scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train) 
x_test = scaler.transform(x_test)
print(np.min(x_train)) #0.0 
print(np.max(x_train)) #1.0


#2.모델구성

model = Sequential()
model.add(Dense(64, input_dim=13)) 
model.add(Dense(32))
model.add(Dense(16))
model.add(Dense(8))
model.add(Dense(1))
model.summary()

model.save("./_save/keras23_3_save_model.h5")

#study 작업 폴더 속 _save 폴더에 /keras23_3_save_model.h5을 저장해라
import numpy as np
from tensorflow.python.keras.models import Sequential, load_model
from tensorflow.python.keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import r2_score
from sklearn.preprocessing import MinMaxScaler

#1.데이터
datasets = load_boston()
x = datasets.data
y = datasets.target

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

scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
print(np.min(x_train)) #0.0
print(np.max(x_train)) #1.0


#2.모델구성

model = load_model("./_save/keras23_2_load_model.h5")
model.summary()

#하단 이미지 참고

 

model summary

 


훈련 후 모델 저장 / 불러오기(model.load_weights)

1. 훈련한 후의 가중치
2. 모델구성하고 훈련까지 한 다음 save weights하면 훈련된 가중치가 불러와진다.
>> 이때, model.compile 도 함께 

*주의사항 훈련된 모델의 가중치를 불러오려면? 

#1.데이터  +  #2. 모델  +  #3.model.compile까지 불러와야지 저장된 가중치를 불러올 수 있다.

 

 

import numpy as np
from tensorflow.python.keras.models import Sequential, load_model
from tensorflow.python.keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import r2_score
from sklearn.preprocessing import MinMaxScaler

#1.데이터

datasets = load_boston()
x = datasets.data
y = datasets.target

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

scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
print(np.min(x_train)) #0.0
print(np.max(x_train)) #1.0



#2.모델구성

model = Sequential()
model.add(Dense(64, input_dim=13))
model.add(Dense(32))
model.add(Dense(16))
model.add(Dense(8))
model.add(Dense(1))
model.summary()



#3. 컴파일, 훈련

from tensorflow.python.keras.callbacks import EarlyStopping
earlyStopping = EarlyStopping(monitor='loss', patience=200, mode='min', verbose=1,restore_best_weights=True)

model.compile(loss='mse', optimizer='adam')


hist = model.fit(x_train, y_train, epochs=1000, batch_size=10, validation_split=0.2, callbacks = [earlyStopping], verbose=1)



model.save_weights("./_save/keras23_5_save_weights2.h5")

#study 작업 폴더 속 _save 폴더에 /keras23_5_save_model.h5을 저장해라

# 4. 평가, 예측


loss = model.evaluate(x_test, y_test)
print('loss : ' , loss)
print("걸린시간 : ", end_time)
y_predict = model.predict(x_test) 

#R2결정계수(성능평가지표)
r2 = r2_score(y_test, y_predict) 
print('r2스코어 : ' , r2) 
import numpy as np
from tensorflow.python.keras.models import Sequential, load_model
from tensorflow.python.keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import r2_score
from sklearn.preprocessing import MinMaxScaler

#1.데이터

datasets = load_boston()
x = datasets.data
y = datasets.target

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

scaler = MinMaxScaler()
scaler.fit(x_train)
x_train = scaler.transform(x_train)
x_test = scaler.transform(x_test)
print(np.min(x_train)) #0.0
print(np.max(x_train)) #1.0



#2.모델구성

model = Sequential()
model.add(Dense(64, input_dim=13))
model.add(Dense(32))
model.add(Dense(16))
model.add(Dense(8))
model.add(Dense(1))
model.summary()



#3. 컴파일, 훈련

model.compile(loss='mse', optimizer='adam')

model.load_weights("./_save/keras23_5_save_weights2.h5")


#하단 이미지 참고

# 4. 평가, 예측

loss = model.evaluate(x_test, y_test)
print('loss : ' , loss)
print("걸린시간 : ", end_time)
y_predict = model.predict(x_test) 

#R2결정계수(성능평가지표)
r2 = r2_score(y_test, y_predict) 
print('r2스코어 : ' , r2) 

 


model checkpoint 

* 에포크마다 모델의 정확도를 함께 기록하면서 저장

 

keras의 콜백함수인 Model Checkpoint는 모델이 학습하면서 정의한 조건을 만족했을 때 Model의 weight 값을 중간 저장해 준다. 학습시간이 꽤 오래걸린다면, 모델이 개선된 validation score를 도출해낼 때마다 weight를 중간 저장함으로써, 혹시 중간에 memory overflow나 crash가 나더라도 다시 weight를 불러와서 학습을 이어나갈 수 있기 때문에, 시간을 save해 줄 수 있다.

 

모델의 저장+재사용 방법: save() 함수 + load_model() 함수
학습 정확도: acc / 테스트셋 정확도: val_acc / 학습셋 오차: loss 로 각각 기록됨
모델을 학습할 때마다 checkpointer의 값을 받아 지정된 곳에 모델 저장
ModelCheckpoint() 함수에 모델이 앞서 저장한 모델보다 나아졌을 때만 저장: save_best_only=True
모델의 학습과정을 history변수를 만들어 저장

import numpy as np 
from tensorflow.python.keras.models import Sequential, load_model
from tensorflow.python.keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import r2_score
from sklearn.preprocessing import MinMaxScaler


#1.데이터
datasets = load_boston()
x = datasets.data
y = datasets.target

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

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



#2.모델구성

model = Sequential()
model.add(Dense(64, input_dim=13)) 
model.add(Dense(32, activation='relu'))
model.add(Dense(16, activation='relu'))
model.add(Dense(1))
model.summary()


  
#3. 컴파일, 훈련

model.compile(loss='mse', optimizer='adam')

# from tensorflow.python.keras.callbacks import EarlyStopping, ModelCheckpoint


# import datetime
# date = datetime.datetime.now()
# print(date) #2022-07-07 17:21:55.876811


# date = date.strftime('%m%d_%H%M') #날짜시간을 스트링으로 변환하는 함수 strftime
# print(date) #0707_1724


# filepath = './_ModelCheckpoint/k24/'
# filename = '{epoch:04d}-{val_loss:.4f}.hdf5'


# earlyStopping = EarlyStopping(monitor='loss', patience=200, mode='min', verbose=1,restore_best_weights=True)


# mcp = ModelCheckpoint(monitor='val_loss', mode = 'auto', verbose=1, save_best_only=True,
#                                         filepath="".join([filepath  +  'k24' , date , '_' , filename]))


# import time  
# start_time = time.time()
# hist = model.fit(x_train, y_train, epochs=100, batch_size=50, validation_split=0.2, callbacks = [earlyStopping, mcp],
#                          verbose=1)


# end_time = time.time() - start_time


model.load_weights("./_ModelCheckpoint/k24/k240707_1928_0098-31.5018.hdf5") 

#0707_1928 : 7월 7일 19시 28분
#0098-31.5018 : 98번째 훈련한 값의 val loss 는 31.5018이다.

# 4. 평가, 예측

loss = model.evaluate(x_test, y_test)

print('loss : ' , loss)
y_predict = model.predict(x_test) 

r2 = r2_score(y_test, y_predict) 
print('r2스코어 : ' , r2) 


print("======================== 1. 기본 출력 ========================")
loss = model.evaluate(x_test, y_test)
print('loss : ', loss)
y_predict = model.predict( x_test )
r2 = r2_score(y_test, y_predict) #y-predict test비교
print('r2스코어 : ', r2)


print("======================== 2. load_model 출력 ========================")
model2 = load_model('./_save/keras24_3_save_model.h5')
loss2 = model2.evaluate(x_test, y_test)
y_predict = model.predict( x_test )
r2 = r2_score(y_test, y_predict) #y-predict test비교
print('r2스코어 : ', r2)


print("======================== 3. ModelCheckPoint 출력 ========================")
model3 = load_model('./_ModelCheckPoint/keras24_ModelCheckPoint3.hdf5')
loss3 = model3.evaluate(x_test, y_test)
print('loss : ', loss3)
y_predict = model.predict( x_test )
r2 = r2_score(y_test, y_predict) #y-predict test비교
print('r2스코어 : ', r2)