728x90
출력한 값을 토대로 정답을 예측하는 함수를 만들었다.
이번에는 모델을 학습 시키고 저장한 뒤 로드한 모델로 출력하는 함수까지 구현하였다.
def model_predict(src_tokenizer,tar_tokenizer,model):
# 예측
idx2word = src_tokenizer.index_word
idx2ner = tar_tokenizer.index_word
idx2ner[0] = 'PAD'
i = 10
y_predicted = model.predict(np.array([X_test[i]]))
y_predicted = np.argmax(y_predicted, axis = -1) # 가장 높은 확률을 추출 (예측값)
true = np.argmax(y_test[i],-1) # 실제 값
print("{:15}|{:5}|{}".format("단어","실제값","예측값"))
print("-"*34)
for w, t , pred in zip(X_test[i], true, y_predicted[0]):
if w != 0:
print("{:17}|{:7}|{}".format(idx2word[w],idx2ner[t].upper(),idx2ner[pred].upper()))
해당 함수를 통해 예측하면 이러한 출력이 나온다.
OOV ('-') 값은 출력되지 않는다.
전체 코드를 살펴보쟈
from data_load import file_load, tag_split
from tokenization import Token
from model import modeling
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing.text import Tokenizer
from sklearn.model_selection import train_test_split
import numpy as np
def model_load(X_train,X_test,y_train,y_test,vocab_size,max_len,tag_size):
model = modeling(vocab_size, max_len,tag_size) # 모델 로드
model.fit(X_train,y_train, batch_size=128, epochs=3,validation_data=(X_test,y_test)) # 모델 학습
model.save('test_model.h5') # 모델 저장
return model
def model_predict(src_tokenizer,tar_tokenizer,model):
# 예측
idx2word = src_tokenizer.index_word
idx2ner = tar_tokenizer.index_word
idx2ner[0] = 'PAD'
i = 10
y_predicted = model.predict(np.array([X_test[i]]))
y_predicted = np.argmax(y_predicted, axis = -1) # 가장 높은 확률을 추출 (예측값)
true = np.argmax(y_test[i],-1) # 실제 값
print("{:15}|{:5}|{}".format("단어","실제값","예측값"))
print("-"*34)
for w, t , pred in zip(X_test[i], true, y_predicted[0]):
if w != 0:
print("{:17}|{:7}|{}".format(idx2word[w],idx2ner[t].upper(),idx2ner[pred].upper()))
if __name__ == "__main__":
file_path = "data/train_data.txt"
tagged_sentences = file_load(file_path)
sentences, ner_tags = tag_split(tagged_sentences)
src_tokenizer, tar_tokenizer,tag_size,vocab_size= Token(sentences,ner_tags)
# 데이터를 학습에 사용하기 위해 데이터를 배열로 변환
X_train = src_tokenizer.texts_to_sequences(sentences)
y_train = tar_tokenizer.texts_to_sequences(ner_tags)
# 데이터의 길이를 동일한 길이로 맞추기 위해 패딩
max_len = 70
X_train = pad_sequences(X_train, padding= "post",maxlen=max_len)
y_train = pad_sequences(y_train, padding= "post",maxlen=max_len)
# 훈련, 실험 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X_train,y_train,test_size=.2,random_state=111)
y_train = to_categorical(y_train,num_classes=tag_size) # 카테고리 데이터를 인덱스로 변환
y_test = to_categorical(y_test,num_classes=tag_size)
# model = model_load(X_train,X_test,y_train,y_test,vocab_size,max_len,tag_size) # 모델 학습
model = load_model('test_model.h5')
model.evaluate(X_test,y_test) # 모델 평가
model_predict(src_tokenizer,tar_tokenizer,model)
"""
모델 불러오려면
model 주석 처리 후
model = keras.models.load_model('모델명.h5')
"""
이렇게 수정해주었다.
이제 성능을 더 높이고 내가 입력한 문장에 대해서 예측하는 함수만 더 만들어주면 끝이다.
728x90
'Project > 캡스톤디자인2' 카테고리의 다른 글
[NLP Project] input 값을 넣어 개체명 인식하기 - 오류 해결 (0) | 2022.11.07 |
---|---|
[NLP Project] 성능 기록 (0) | 2022.11.06 |
[NLP Project] 4. LSTM 모델 구축 (0) | 2022.11.06 |
[NLP Project] 2. 토큰화 하기 (0) | 2022.11.05 |
[NLP Project] 1. 데이터 로드하고 전처리하기 (0) | 2022.11.05 |