딥러닝 기초

학습한 모델 저장 및 불러오기

lskeras 2024. 7. 31. 20:57

기업 프로젝트 할 당시 성능 잘나온 모델을 수시로 저장하지 않고 매번 모델을 돌려서 성능을 보여줬던 기억이 난다.

기본적인 학습한 모델 저장 및 불러오는 방법에 대해서 간략하게 알아보자


import tensorflow as tf 
import numpy as np

(trainX, trainY), (testX, testY) = tf.keras.datasets.fashion_mnist.load_data()

trainX = trainX / 255.0
testX = testX / 255.0

trainX = trainX.reshape( (trainX.shape[0], 28,28,1) )
testX = testX.reshape( (testX.shape[0], 28,28,1) )

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape = (28,28,1)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax'),
])

model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(trainX, trainY, validation_data=(testX, testY), epochs=3)

epoch를 3번 진행한 모델을 저장해보자

# 모델 저장하기
model.save('new_folder/model1')

경로/저장할 이름 방식으로 코드를 통해 model 저장 가능


저장한 모델을 불러와보자

# 모델불러오기
load_model = tf.keras.models.load_model('new_folder/model1')
load_model.summary()
model.evaluate(testX,testY)

이후 evaluate를 통해 같은 데이터를 넣어 성능을 평가해보면

위에 저장한 모델과 같은 성능(0.8712)의 accuracy를 확인

 

해당 과정은 모델의 layer부터 가중치 등의 모든 요소를 전부 불러오는 방법이다.


모델의 가중치만 저장하고 새로 만든 모델에 가중치만 적용시켜 학습을 계속시키는 방법을 활용하기위해 weight만 load해보자

# 모델의 weight만 저장하기
import tensorflow as tf 
import numpy as np

(trainX, trainY), (testX, testY) = tf.keras.datasets.fashion_mnist.load_data()

trainX = trainX / 255.0
testX = testX / 255.0

trainX = trainX.reshape( (trainX.shape[0], 28,28,1) )
testX = testX.reshape( (testX.shape[0], 28,28,1) )

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape = (28,28,1)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax'),
])
callback = tf.keras.callbacks.ModelCheckpoint(
    filepath = 'checkpoint/mnist', #mnist(epoch)
    monitor = 'val_acc',
    mode='max'
    save_weights_only = True,
    save_freq = 'epoch'
)
model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(trainX, trainY, validation_data=(testX, testY), epochs=3, callbacks = [callback])

callback 함수에서

filepath - 저장경로를 설정하고 checkpoint/mnist{epoch}를 통해 epoch마다 저장되는 모든 가중치를 저장가능(설정안하면 덮어쓰기)

monitor - val_acc를 통해 validation data의 acc 성능을기준으로 저장

mode - 'max'를 통해 최대값 저장

save_weigths_only - 를 통해 가중치만 저장하도록 설정

save_freq - epoch 설정으로 각 epoch마다 가중치 저장

 

이후 학습부분에 callback 함수를 불러오면 다음과 같이 가중치가 저장

이제 새로 model2를 만들고 학습한 가중치를 불러와 모델에 적용시키면 위에 val_acc 0.8650과 같은 값이 나와야한다.

model2 = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape = (28,28,1)),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax'),
])
model2.summary()
model2.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model2.load_weights('checkpoint/mnist')
model2.evaluate(testX,testY)

같게 나왔다!

 


인공지능, 머신러닝 분야에서 협업이나 개발에서 아주 자주 쓰일 코드라고 생각된다. 생각 안날때마다 보려와서 익히는게 좋을 것 같다.