728x90
모델 구축에는 keras 함수를 이용하였다.
그리고 옵티마이저는 Adam
모델의 구성은 다음과 같다.
1. 입력을 실수 벡터로 임베딩
2. 양방향 LSTM 구성
3. Dense Layer를 통한 각 태그에 속할 확률을 예측
TimeDistributed는 상위 layer의 출력이 step에 따라 여러개로 출력되어 이를 적절하게 분배해주는 역할을 한다.
model.py
from keras.models import Sequential
from keras.layers import Dense, Embedding, LSTM, Bidirectional, TimeDistributed
from keras.optimizers import Adam
def modeling(vocab_size, max_len,tag_size):
model = Sequential()
model.add(Embedding(input_dim = vocab_size, output_dim= 128, input_length= max_len, mask_zero=True))
model.add(Bidirectional(LSTM(256, return_sequences=True))) # unit= 256
model.add(TimeDistributed(Dense(tag_size,activation='softmax'))) # 최종 결과 (다중 분류이므로 소프트맥스 함수 사용)
model.compile(loss= 'categorical_crossentropy',
optimizer= Adam(0.001), # 학습률
metrics=['accuracy'],
) # 모델 컴파일
return model
main.py 에는 다음 코드를 추가한다.
학습 결과를 빠르게 보고싶어서 에포크는 3회만 진행하였다.
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') # 모델 저장
model.evaluate(X_test,y_test) # 모델 평가
추후에 파라미터 조절을 하면서 성능을 향상시킬 것이다.
76%의 정확도를 보이는 것 같다.
모델도 이렇게 저장된 모습을 볼 수 있다.
main.py 전체코드
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 keras.models import load_model
from sklearn.model_selection import train_test_split
import numpy as np
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 = 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') # 모델 저장
model.evaluate(X_test,y_test) # 모델 평가
728x90
'Project > 캡스톤디자인2' 카테고리의 다른 글
[NLP Project] input 값을 넣어 개체명 인식하기 - 오류 해결 (0) | 2022.11.07 |
---|---|
[NLP Project] 성능 기록 (0) | 2022.11.06 |
[NLP Project] 5. 정답 예측하기 (0) | 2022.11.06 |
[NLP Project] 2. 토큰화 하기 (0) | 2022.11.05 |
[NLP Project] 1. 데이터 로드하고 전처리하기 (0) | 2022.11.05 |