0. 세팅 및 데이터 셋 확인
!pip install korpora
from Korpora import Korpora
Korpora 라이브러리를 활용해 데이터셋을 가져온다
Korpora 는 연구 목적으로 공유된 말뭉치들을 손쉽게 다운로드, 사용할 수 있는 기능을 제공해,
Korpora 라이브러리 내에 다양한 말뭉치 데이터들이 있다
그 중에서 Naver 영화 리뷰 말뭉치인 nsmc 데이터를 활용할 것이다
- 데이터 셋 구성
nsmc_corpus = Korpora.load('nsmc')
train_data = list(nsmc_corpus.train.texts)[:3000]
test_data = list(nsmc_corpus.train.texts)[:1000]
train_label = np.array(list(nsmc_corpus.train.labels)[:3000])
test_label = np.array(list(nsmc_corpus.train.labels)[:1000])
- load 함수를 통해서 nsmc 말뭉치를 가져온다
- 훈련 데이터는 3000개, 학습 데이터는 1000개로 세팅한다
1. 데이터 전처리
- 문장 토큰화 및 인코딩
import numpy as np
def tokenize_sentence(sentences):
return np.array([tokenizer.encode(text, max_length=80, padding='max_length', truncation=True) for text in sentences])
- text에 있는 문장을 하나씩 가져와서 단어들로 토큰화 및 인코딩을 진행한다
- max_length: 최대 길이를 설정
- padding: 최대길이 만큼
- truncation=True:
train_sequences = tokenize_sentence(train_data)
test_sequences = tokenize_sentence(test_data)
- 토큰화 및 인코딩 후에는 최대 길이로 지정한 80의 길이를 갖는 벡터로 변한 것을 확인할 수 있다
- 인코딩을 진행한 배열의 길이가 80보다 짧다면 모두 0으로 채운다
2. 모델 구성
import tensorflow as tf
rnn = tf.keras.Sequential([
tf.keras.layers.Embedding(input_dim = tokenizer.vocab_size,
output_dim=64,
input_length=80), # input layer
tf.keras.layers.SimpleRNN(32),
tf.keras.layers.Dense(1, activation='sigmoid')
])
rnn.compile(
loss='binary_crossentropy',
optimizer = 'adam',
metrics=['accuracy']
)
- 입력층의 input 길이는 토큰화 시에 지정한 최대 길이로 한다
- SimpleRNN layer로 층을 구성
- 출력값은 0 또는 1의 하나의 값이기 때문에 출력층의 node는 1로 설정한다
- 이진분류이기 때문에 손실함수는 'binary_crossentropy'를 사용한다
- 옵티마이저는 adam으로, 성능평가 지표는 accuracy로 한다
3. 모델 학습
rnn.fit(
train_sequences,
train_label,
epochs=5,
validation_data=(test_sequences, test_label)
)
- fit 함수로 학습한다
- epochs은 5로 주어 전체 데이터를 5번 사용해서 학습하도록 한다
- 손실함수 값은 0.42가 가장 낮게, 정확도 값은 0.83이 가장 높게 나왔다
반응형
'IT Study > ML & DL' 카테고리의 다른 글
[RNN] RNN, LSTM, GRU 모델 (1) | 2023.12.31 |
---|---|
[CNN] OpenCV 실습 | 이미지 조각 순서변경, 프리윗 필터, 회선처리 (1) | 2023.12.31 |
[DL/NLP] Word2Vec - CBOW & Skip-Gram 방식 (1) | 2023.12.23 |
[DL/CNN] CNN 실습 (with. MNIST data) (0) | 2023.12.22 |