[ 딥러닝 ]

tf.keras load_model 오류 - ValueError: No model config found in the file at ...

불주먹고양이 2023. 8. 19. 17:10

Callback 함수에서 ModelCheckpoint를 설정하고 best model을 저장하였다. 저장한 모델을 불러오려고 했는데 다음과 같은 오류가 떠서 해결해보려고 한다.

from tensorflow.keras.callbacks import ModelCheckpoint
from tensorflow.keras.models import load_model

model_cp = ModelCheckpoint('best_model.h5',save_weights_only=True, monitor='val_loss', save_best_only=True, mode='min')

model_best = load_model('best_model.h5')
model_best

 

" ValueError: No model config found in the file at ... " 이라는 에러이다.

 

load_model 함수를 사용하여 모델을 불러올 때는 저장된 모델의 아키텍처와 가중치들을 함께 불러와야 한다. ModelCheckpoint에서 save_weights_only=True 옵션으로 인해 모델 아키텍처가 저장되지 않았기 때문에 해당 에러가 발생한 것이다.

 

 

1. 모델 아키텍처와 가중치 모두 저장하기

모델 아키텍처와 가중치를 함께 저장하여 load_model을 사용하여 불러올 수 있도록 한다. 아래와 같이 save_weights_only를 False로 설정한다.

 

model_cp = ModelCheckpoint('best_model.h5', save_weights_only=False, monitor='val_loss', save_best_only=True, mode='min') # save_weights_only=True 하면 load 불가능

save_weights_only=False (Default)

 

 

2. 모델 아키텍처 별도로 저장하기

모델 아키텍처를 따로 저장한 후, 가중치를 저장한다. 그런 다음 모델을 불러올 때 아키텍처 파일과 가중치 파일을 각각 불러온다.

 

(1) 모델 아키텍처 저장

# JSON 형식으로 모델 아키텍처 저장
model_json = model.to_json()
with open('best_model.json', 'w') as json_file:
    json_file.write(model_json)

 

(2) 가중치 저장:

model_cp = ModelCheckpoint('best_model_weights.h5', monitor='val_loss', save_best_only=True, save_weights_only=True, mode='min')

 

(3) 모델 불러오기

from tensorflow.keras.models import model_from_json

# 모델 아키텍처 불러오기
with open('best_model.json', 'r') as json_file:
    loaded_model_json = json_file.read()
model_best = model_from_json(loaded_model_json)

# 가중치 불러오기
model_best.load_weights('best_model_weights.h5')

 

아무래도 첫번째 방법이 간단해보이긴 한다.

하지만, save_weights_only=True를 해주는 이유가 Weight와 Bias만 저장할 수 있어서인데, 이렇게 설정해주는 이유는 가끔 버전에 따라서 keras의 fit()에서 모델과 Weight를 함께 저장하는 방식에서 오류가 나는 경우가 있기 때문이다.

 

 

 

3. SavedModel 형식

from tensorflow.keras.models import save_model, load_model

train_input = np.random.random((128, 32))
train_target = np.random.random((128, 1))

input_tensor = Input(shape=(32,))
output = Dense(2, activation='relu')(input_tensor)
model = Model(inputs=input_tensor, outputs=output)
model.summary()

model.compile(optimizer=Adam(lr=0.01), loss='mean_squared_error', metrics='accuracy')
model.fit(x=train_input, y=train_target)

save_model('best_model')

loaded_model = load_model('best_model')

 

 

출처 : https://www.tensorflow.org/guide/saved_model?hl=ko