20. 모델 저장하고 복원하기

학습이 이루어진 모델을 저장하고 복원할 수 있습니다.

케라스는 HDF5 (.h5) 표준 포맷을 제공해서, 모델의 가중치, 모델 구성, 옵티마이저 설정까지 저장합니다.

저장한 모델을 TensorFlow.js로 불러와서 웹 브라우저에서 모델을 다시 훈련하고 실행하거나, 모바일 장치에 맞도록 변환해서 사용할 수 있습니다.

아래의 MNIST 손글씨 이미지 인식 예제에서 save()와 load_model() 메서드의 사용에 대해 알아봅니다.


모델 저장

예제

import tensorflow as tf

# 1. MNIST 데이터넷 임포트
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 2. 데이터 전처리
x_train, x_test = x_train/255.0, x_test/255.0

# 3. 모델 구성
model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])

# 4. 모델 컴파일
model.compile(optimizer='adam',
            loss='sparse_categorical_crossentropy',
            metrics=['accuracy'])

# 5. 모델 훈련
model.fit(x_train, y_train, epochs=5)

# 6. 모델 저장
model.save('model1.h5')
Train on 60000 samples
Epoch 1/5
60000/60000 [==============================] - 7s 119us/sample - loss: 0.2002 - accuracy: 0.9414
Epoch 2/5
60000/60000 [==============================] - 7s 123us/sample - loss: 0.0798 - accuracy: 0.9754
Epoch 3/5
60000/60000 [==============================] - 6s 107us/sample - loss: 0.0518 - accuracy: 0.9835
Epoch 4/5
60000/60000 [==============================] - 6s 104us/sample - loss: 0.0384 - accuracy: 0.9872
Epoch 5/5
60000/60000 [==============================] - 6s 106us/sample - loss: 0.0259 - accuracy: 0.9914

5회의 에포크 동안 학습이 이루어진 모델을 save() 메서드를 이용해서 저장했습니다.

이제 ‘model1.h5’ 파일이 생성됩니다.



모델 복원하기

예제

import tensorflow as tf

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train/255.0, x_test/255.0

# 모델 복원
loaded_model = tf.keras.models.load_model('model1.h5')
loaded_model.summary()

loss, acc = loaded_model.evaluate(x_test, y_test, verbose=2)
print('Loss: ', loss)
print('Acc: ', acc)
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
flatten (Flatten)            (None, 784)               0
_________________________________________________________________
dense (Dense)                (None, 512)               401920
_________________________________________________________________
dense_1 (Dense)              (None, 10)                5130
=================================================================
Total params: 407,050
Trainable params: 407,050
Non-trainable params: 0
_________________________________________________________________

10000/1 - 1s - loss: 0.0348 - accuracy: 0.9807
Loss:  0.06882412914167507
Acc:  0.9807

load_model() 메서드를 이용해서 저장한 모델 (‘model1.h5’)을 불러왔습니다.

summary()를 이용해서 모델에 대한 정보를 확인합니다.

그리고 evaluate()를 이용해서 이전의 훈련의 결과를 확인합니다.


공식 문서에 의하면, 모델의 구조를 저장할 수 있지만 모델을 로드한 후에 다시 컴파일 해야합니다.

즉, 옵티마이저의 상태는 유지되지 않습니다.



이전글/다음글