모델을 만든 후 학습시키는 시간 또한 데이터가 크면 클수록 오래걸린다. 짧게는 수 분에서 길게는 몇일이 걸릴 정도이다. 이를 통해 결과를 얻는다면 다음에 이걸 적용해 볼때마다 학습시키고 사용해야 하는가?
본인도 처음 모델을 만들고 학습시킨 후, 저장 및 불러오는 방법을 몰라 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 기법을 활용한 감성분석 시 사용한 모델이다. 모델 저장은 크게 어렵지 않지만, 불러오는 것 또한 준비할게 있다는 걸 명심해두길 바란다.