본문 바로가기
책[이해 및 학습]

9. [혼자 공부하는 머신러닝/딥러닝] 모델 저장과 복원

by Hot김치 2024. 3. 9.

모델 저장과 복원

기존 code

In [1]:
import tensorflow as tf
from tensorflow import keras

from tensorflow import keras
(train_input, train_target), (test_input, test_target) =\
    keras.datasets.fashion_mnist.load_data()

from sklearn.model_selection import train_test_split
train_scaled = train_input/255.0
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled, train_target, test_size=0.2, random_state=42)


def model_fn(a_layer=None):
    model = keras.Sequential()
    model.add(keras.layers.Flatten(input_shape=(28, 28)))
    model.add(keras.layers.Dense(100, activation='relu', name='hidden'))
    
    if a_layer:
        model.add(a_layer)
    
    model.add(keras.layers.Dense(10, activation='softmax', name='output'))
    
    return model  
In [3]:
model = model_fn(keras.layers.Dropout(0.3))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
history = model.fit(train_scaled, train_target, epochs=10, verbose=0, validation_data=(val_scaled, val_target))

keras 모델 => 훈련된 모델의 파라미터를 저장하는 간편한 save_weights() 메서드 제공

  • tensorflow의 체크포인트 포멧으로 저장하지만, 파일의 확장자가 '.h5'일 경우 HDF5 포멧으로 저장
  • 모델 구조와 모델 파라미터를 함께 저장하는 save() 메서드 제공
In [5]:
model.save_weights('model-weights.h5')
In [7]:
model.save('model-whole.h5')

위의 메서드로 인하여 2가지 파일이 형성.

  • save_weights() <==> load_weights()
  • 저장했던 모델과 정확히 같은 구조를 가져야 load가 가능하다.
In [10]:
model = model_fn(keras.layers.Dropout(0.3))
model.load_weights('model-weights.h5')

검증 정확도를 확인

  • 예측을 수행하는 predict()
  • 해당 데이터는 10개의 클래스로 되어 있기에, 10개의 클래스에 대한 확률을 반환
  • 패션 MNIST 데이터셋(12000개) => (12000, 10) 크기의 배열을 반환 
  • 10개 확률 중, 가장 큰 값의 인덱스를 골라 타깃 레이블과 비교하여 정확도 계산
  • evaluate() 메서드는 손실을 계산하기 위해, 반드시 먼저 compile() 메서드를 실행

훈련된 모델 파라미터 파일을 읽어서 정확도 확인

In [11]:
import numpy as np
val_labels = np.argmax(model.predict(val_scaled), axis=-1)
print(np.mean(val_labels == val_target))
375/375 [==============================] - 1s 2ms/step
0.8773333333333333

predict() & argmax()

  • 모델의 predict() 메서드의 결과에서 가장 큰 값을 고르기 위해 => argmax() 함수: 배열에서 가장 큰 값의 인덱스 반환
  • argmax() 함수의 axis=-1은 배열의 마지막 차원을 따라 최대값을 선정 

모델 전체를 파일에서 읽은 다음 검증 세트의 정확도를 확인

  • load_model() 함수는 모델 파라미터뿐만 아니라 모델구조와 옵티마이저 상태까지 모두 복원, 그러한 이유때문에 evaluate() 사용 가능
In [12]:
model = keras.models.load_model('model-whole.h5')
model.evaluate(val_scaled, val_target)
375/375 [==============================] - 1s 2ms/step - loss: 0.3334 - accuracy: 0.8773
Out[12]:
[0.33335167169570923, 0.8773333430290222]

같은 모델을 저장하고 다시 불러들였기 때문에 위와 동일한 정확도를 얻음.