[DL] model save / checkpoint
훈련 전 모델 저장 / 불러오기 (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.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) |