학습 모델 저장하는 법

박재형·2025년 4월 26일
0
post-thumbnail

저번 시간까지는 모델을 생성하고 실행할 때마다 ephochs를 돌려야했었다. 이번 시간에는 레이어 설정, loss 함수, optimizer, 훈련 후의 w값을 저장하는 방법을 소개하겠다.
이번 시간에는 전에 했었던 의류 구분 모델을 저장하는 방법을 예시로 소개하겠다.

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)),
    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)

이 상태로 모델을 학습시키면,

위와 같은 결과가 나오게 된다.

이 모델이 정확도 86%로 어느정도 훈련이 잘 되었으니 저장하고 싶을 때, 저장 방법으론 두 가지가 있다.

첫번째로 전체 모델을 저장하는 방법이다. 이는 레이어 순서, 함수 종류, 가중치를 위에서 말했던 것 처럼 모두 저장해준다.

방법은,

model.save('파일 이름')

간단하게 이 코드를 하나 적는 것으로 학습된 모델을 저장해준다. 이제 이 코드를 실행시켜보면,

이런 식으로 입력한 이름을 바탕으로 새 파일을 만들어서 모델을 저장해준다. 해당 프로그램 파일 형식은 텐서플로우가 사용하는 파일 형식이다.

이제 이 저장한 모델을 불러오는 방법은,

불러온모델= tf.keras.models.load_model('파일 이름')

이런 식으로 코드를 입력하면 된다.

한 번 아까 저장한 파일이 맞는지 테스트를 해보겠다.

불러온모델.summary()
불러온모델.evaluate(testX,testY)

를 입력해보면,

loss값, 정확도까지 똑같이 잘 확인이 된다.

이제 두번째로, w값만 저장하는 방법이 있다.

그건 바로 callback 함수를 활용하는 것이다.
이 함수는 다른 함수가 실행을 끝낸 뒤 실행되는 함수이다.

콜백함수 = tf.keras.callbacks.ModelCheckpoint(
   filepath = '파일 이름',
   save_weights_only=True,
   save_freq='epoch'
)

이 콜백함수는 매 epoch가 실행되고 끝날 때마다, W값을 새 파일에다가 저장하는 함수이다.

이제 이 콜백 함수를 학습 모델에 파라미터로 넣어주면,

model.fit(trainX, trainY, validation_data=(testX, testY), epochs=3,callbacks=[콜백함수])

실행해보면

이런 식으로 파일이 만들어지게 된다.

그런데 의문이 들 수 있다. 이 코드는 3번의 epochs가 있는데 왜 1개의 w값만 있지?

이는 이 콜백함수가 w값을 계속 덮어쓰기 때문이다.

그럼 만약 내가 모든 epochs에서의 w값을 모두 따로 저장하고 싶다면,

filepath = '파일 이름{epoch}'

라고 써주면 된다.

실행해보면,

3개가 나오게 된다.

이제 이 w값을

model2 = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28,28)),
    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('파일 이름')

model2.evaluate()

이렇게 사용해보면 전과 같은 w값을 가진 걸 확인해볼 수 있다.

0개의 댓글