[NLP Project] 5. 정답 예측하기

2022. 11. 6. 01:05·Project/캡스톤디자인2
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
'Project/캡스톤디자인2' 카테고리의 다른 글
  • [NLP Project] input 값을 넣어 개체명 인식하기 - 오류 해결
  • [NLP Project] 성능 기록
  • [NLP Project] 4. LSTM 모델 구축
  • [NLP Project] 2. 토큰화 하기
sillon
sillon
꾸준해지려고 합니다..
    반응형
  • sillon
    sillon coding
    sillon
  • 전체
    오늘
    어제
    • menu (614)
      • notice (2)
      • python (68)
        • 자료구조 & 알고리즘 (23)
        • 라이브러리 (19)
        • 기초 (8)
        • 자동화 (14)
        • 보안 (1)
      • coding test - python (301)
        • Programmers (166)
        • 백준 (76)
        • Code Tree (22)
        • 기본기 문제 (37)
      • coding test - C++ (5)
        • Programmers (4)
        • 백준 (1)
        • 기본기문제 (0)
      • 공부정리 (5)
        • 신호처리 시스템 (0)
        • Deep learnig & Machine lear.. (41)
        • Data Science (18)
        • Computer Vision (17)
        • NLP (40)
        • Dacon (2)
        • 모두를 위한 딥러닝 (강의 정리) (4)
        • 모두의 딥러닝 (교재 정리) (9)
        • 통계 (2)
      • HCI (23)
        • Haptics (7)
        • Graphics (11)
        • Arduino (4)
      • Project (21)
        • Web Project (1)
        • App Project (1)
        • Paper Project (1)
        • 캡스톤디자인2 (17)
        • etc (1)
      • OS (10)
        • Ubuntu (9)
        • Rasberry pi (1)
      • App & Web (9)
        • Android (7)
        • javascript (2)
      • C++ (5)
        • 기초 (5)
      • Cloud & SERVER (8)
        • Git (2)
        • Docker (1)
        • DB (4)
      • Paper (7)
        • NLP Paper review (6)
      • 데이터 분석 (0)
        • GIS (0)
      • daily (2)
        • 대학원 준비 (0)
      • 영어공부 (6)
        • job interview (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Python
    programmers
    백준
    소수
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
sillon
[NLP Project] 5. 정답 예측하기
상단으로

티스토리툴바