모델을 만든 후 학습시키는 시간 또한 데이터가 크면 클수록 오래걸린다. 짧게는 수 분에서 길게는 몇일이 걸릴 정도이다. 이를 통해 결과를 얻는다면 다음에 이걸 적용해 볼때마다 학습시키고 사용해야 하는가? 

본인도 처음 모델을 만들고 학습시킨 후, 저장 및 불러오는 방법을 몰라 30분가량을 기다리고 사용해보고 했다. 비효율 적인 상황에서 구글링을 하였고 해결책을 얻었다.

 

크게 세가지로 구분하자.

1. 모델을 저장하는 코드

model_save

2. 모델을 불러오는 코드

model_load

3. 불러온 모델을 평가하는 코드

model.compile,model.evaluate

 

1. 모델을 저장하는 코드

모델을 저장할 경우 두가지를 저장하면 된다. 

Model 을 저장하는 json 파일, Weight을 저장하는 h5 파일

 

코드는 다음과 같다.

#모델 저장
json_model=model.to_json()
with open("C:/data/model.json","w") as json_file:  
#쌍따옴표 안은 절대경로에 저장하면 파일 이름.josn
#임의 경로를 원한다면 경로 설정
	json_file.write(model_json)

#가중치 저장
model.save_weights("C:/data/weight_model.h5")
#쌍따옴표 안은 절대경로에 저장하면 파일 이름.josn
#임의 경로를 원한다면 경로 설정

2. 모델을 불러오는 코드

모데를 불러오려면 똑같이 model과 weight을 불러와야한다. 그렇다면 json 파일 및 h5를 불러오면 되는것이다.

from keras.models import model_from_json
#모델 불러오기
json_model=open("C:/data/model.json","r")
loadded_json_model=json_model.read()
json_model.close()
loadded_json_model=model_from_json(loadded_json_model)

#가중치 불러오기
model.load_weight("C:/data/weight_model.h5")

 

3. 모델을 평가하기. 

본인은 이것이 가장 중요하다 생각한다. 실제 내가 훈련시킨 데이터를 저장해 놓지 않았다면, 위 작업은 의미가 없다. pkl형식이든 csv형식이든 훈련데이터는 존재해야 한다. 꼭!

 

#평가하기
load_model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])
print("\n 테스트 정확도: %.4f" % (loaded_model.evaluate(X_test, Y_test)[1]))

 

평가 코드는 간단하다. 하지만 위에서 언급한 것처럼 X_test와 Y_test가 없으면 아무 소용이 없다.

 

예시를 통해 확인해보자 불러오고 컴파일시큰 것까지 정리된 것이다.

from nltk.corpus import stopwords
import pandas as pd
from konlpy.tag import Okt
okt=Okt()
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from keras.models import model_from_json
stopwords = ['도', '는', '다', '의', '가', '이', '은', '한', '에', '하', '고', '을', '를', '인', '듯', '과', '와', '네', '들', '듯', '지', '임', '게','요','거','로','으로',
            '것','수','할','하는','제','에서','그','데','번','해도','죠','된','건','바','구','세']

train_data=pd.read_pickle("c:/data/Train_data.pkl")
test_data=pd.read_pickle("c:/data/Test_data.pkl")
X_Train=train_data['tokenized'].values
Y_Train=train_data['label'].values
X_Test=test_data['tokenized'].values
Y_Test=test_data['label'].values
tokenizer=Tokenizer()
tokenizer.fit_on_texts(X_Train)
vocab_size=19249
tokenizer=Tokenizer(vocab_size,oov_token='OOV')
tokenizer.fit_on_texts(X_Train)
X_Train=tokenizer.texts_to_sequences(X_Train)
X_Test=tokenizer.texts_to_sequences(X_Test)
max_len=100
X_Train=pad_sequences(X_Train,maxlen=max_len)
X_Test=pad_sequences(X_Test,maxlen=max_len)

json_file=open("c:/data/model.json","r")
loaded_model_json=json_file.read()
json_file.close()
loaded_model=model_from_json(loaded_model_json)
loaded_model.load_weights("c:/data/best_model_GRU.h5")
loaded_model.compile(optimizer='rmsprop',loss='binary_crossentropy',metrics=['acc'])

def GRU_predict(new_sentence):
    max_len=90
    new_sentence=okt.morphs(new_sentence)
    new_words=[word for word in new_sentence if not word in stopwords]
    encoded=tokenizer.texts_to_sequences([new_sentence])
    pad_new=pad_sequences(encoded,maxlen=max_len)
    score=float(loaded_model.predict(pad_new))
    percentage=score*100
    return percentage,new_words

위 작업은 GRU 기법을 활용한 감성분석 시 사용한 모델이다. 모델 저장은 크게 어렵지 않지만, 불러오는 것 또한 준비할게 있다는 걸 명심해두길 바란다.

+ Recent posts