학습한 모델은 메모리에 저장이 되어있어
프로그램을 종료하면 학습의 결과가 날아가게 된다.
데이터의 용량이 큰 학습의 경우 학습에 며칠씩 걸리는 경우가 있는데,
학습 중간에 프로그램이 꺼졌거나 껐다가 다시 켜야하거나... 하는 상황이라면 눈물이 난다.
당연히 이런 슬픔을 방지할 수 있게 해두었다
학습한 모델은 따로 저장을 할 수가 있다.
모델 저장 방법은 두 가지가 있다.
- 모델 구조와 weight, bias 모두 저장
이 방법은 다음에 사용할 때 그냥 불러와서 사용하면 되기 때문에
매우 편리하다는 장점을 가지고 있지만,
저장해야 하는 내용이 많아 파일의 용량이 크다는 단점을 가진다. - weight와 bias만 저장
위의 방법과 정확히 반대의 특징을 가진다.
저장해야 하는 파일의 용량은 작지만
다시 사용하려면 모델의 구조를 만들어 두어야 저장된 값을 로드할 수 있다.
또 다시 MNIST 데이터 셋을 이용해서 저장하는 방법을 알아보았다.
이전 포스팅에 모델에 L2 규제를 추가했다.
import
import numpy as np
import pandas as pd
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Flatten, Dense
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.optimizers import SGD
from tensorflow.keras import regularizers
from tensorflow.keras.callbacks import ModelCheckpoint
Data Load ~ Evaluation
# data load
df = pd.read_csv('./data/mnist/train.csv')
# data split
train_x_data, test_x_data, train_t_data, test_t_data = \
train_test_split(df.drop('label', axis=1, inplace=False),
df['label'],
test_size=0.3,
random_state=1,
stratify=df['label'])
# data scaling
scaler = MinMaxScaler()
scaler.fit(train_x_data)
norm_train_x_data = scaler.transform(train_x_data)
norm_test_x_data = scaler.transform(test_x_data)
# model building
model = Sequential()
model.add(Flatten(input_shape=(norm_train_x_data.shape[1],)))
model.add(Dense(units=10,
kernel_regularizer= regularizers.l2(0.001),
activation='softmax'))
model.compile(optimizer=SGD(learning_rate=1e-3),
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
###################### 모델 저장 ############################
checkpoint_path='./training_ckpt/mnist.ckpt'
cp_callback = ModelCheckpoint(filepath=checkpoint_path,
save_weights_only=True,
verbose=1)
############################################################
history = model.fit(norm_train_x_data, train_t_data,
epochs=100,
batch_size=100,
verbose=1,
validation_split=0.2,
callbacks=[cp_callback]) ##################
print(model.evaluate(norm_test_x_data, test_t_data))
checkpoint_path로 경로를 지정해주고 model checkpoint를 만들어 학습에 지정해주었다.
Epoch 1/100
227/236 [===========================>..] - ETA: 0s - loss: 2.3026 - accuracy: 0.1262
Epoch 00001: saving model to ./training_ckpt\mnist.ckpt
236/236 [==============================] - 1s 3ms/step - loss: 2.2981 - accuracy: 0.1287 - val_loss: 2.1770 - val_accuracy: 0.2111
Epoch 2/100
203/236 [========================>.....] - ETA: 0s - loss: 2.0750 - accuracy: 0.3154
Epoch 00002: saving model to ./training_ckpt\mnist.ckpt
236/236 [==============================] - 0s 2ms/step - loss: 2.0599 - accuracy: 0.3312 - val_loss: 1.9642 - val_accuracy: 0.4282
.............
...........
Epoch 100/100
217/236 [==========================>...] - ETA: 0s - loss: 0.5027 - accuracy: 0.8824
Epoch 00100: saving model to ./training_ckpt\mnist.ckpt
236/236 [==============================] - 0s 2ms/step - loss: 0.5040 - accuracy: 0.8824 - val_loss: 0.5095 - val_accuracy: 0.8784
394/394 [==============================] - 0s 939us/step - loss: 0.5186 - accuracy: 0.8771
[0.5186089873313904, 0.8771428465843201]
학습이 완료된 후 주피터 노트북이 저장되어있는 경로에 가보면
지정한 폴더가 생기고 폴더 안에 학습을 저장한 파일들을 찾아볼 수 있다.
다른 주피터 노트북 파일을 생성하거나 %reset으로 현재 메모리를 초기화 해준 후
위의 코드를 #### 모델 저장 #### 부분 위까지만 작성한 후 실행하고,
학습을 진행하지 않고 평가를 진행해보면
394/394 [==============================] - 0s 919us/step - loss: 2.4946 - accuracy: 0.0555
[2.4946084022521973, 0.05547618865966797]
당연하게도 이런 처참한 결과가 나온다.
이제 저장한 weigth와 bias를 불러 온 다음에 다시 확인해본다.
checkpoint_path='./training_ckpt/mnist.ckpt'
model.load_weights(checkpoint_path)
print(model.evaluate(norm_test_x_data, test_t_data))
# loss accuracy
# [0.5186089873313904, 0.8771428465843201]
394/394 [==============================] - 0s 992us/step - loss: 0.5186 - accuracy: 0.8771
[0.5186089873313904, 0.8771428465843201]
그러면 아까와 동일한 결과값이 나오는 것을 확인할 수 있다!!
'Programming > Tensorflow' 카테고리의 다른 글
[Tensorflow 1.15] 이미지 Convolution, Pooling의 결과 확인하기 (0) | 2022.04.14 |
---|---|
[Tensorflow 1.15 ] Convolution 연산 - Sample Case (2) | 2022.04.14 |
[Tensorflow] MNIST DNN으로 구현해보기 (0) | 2022.04.12 |
[Tensorflow] Tensorflow 2.xx with Keras (0) | 2022.04.07 |
[tensorflow] Tensorflow 1.15 ver - 기초, Linear Regression (0) | 2022.04.06 |