import tensorflow as tf
from tensorflow import keras
tf.keras.utils.set_random_seed(42)
tf.config.experimental.enable_op_determinism()
사용 데이터셋
from tensorflow.keras.datasets import imdb
💡 IMDB : 영화 리뷰 감상평 데이터 - 순환신경망에서 대표적으로 사용되는 데이터셋(외국) - 케라스에서 영어로된 문장을 정수(숫자)로 변환하여 제공하는 데이터셋 - 감상평이 긍정과 부정으로 라벨링 되어있음 - 총 50,000개의 샘플로 되어 있으며, 훈련 및 테스트로 각각 25,000개씩 분리하여 제공됨
IMDB 데이터 읽어들이기 - num_words=500 : 말뭉치 사전의 갯수 500개만 추출하겠다는 의미 * list 1개 = 문장 1개 * 5만개의 문장 들어있음 * 마지막 list는 긍정/부정에 대한 값이 들어있음(0 : 부정, 1 : 긍정)
정규화(텍스트 데이터) - 텍스트 기반의 데이터인 경우 정규화는 스케일링 처리가 아닌 문자열의 길이를 통일시키는 처리를 진행한다. - 훈련 모델은 정해진 행렬의 사이즈를 기준으로 훈련하기 때문이다.
import numpy as np
lengths = np.array([len(x) for x in train_input])
lengths.shape, lengths
lengths의 값을 이용해서 전체평균과 중앙값 출력하기
np.mean(lengths), np.median(lengths)
시각화
import matplotlib.pyplot as plt
from matplotlib import font_manager, rc
plt.rc("font", family="Malgun Gothic")
plt.title("텍스트 길이 분포 확인")
plt.hist(lengths)
plt.xlabel("length(단어 갯수)")
plt.ylabel("빈도")
plt.show()
중앙값이 평균값보다 낮으면 왼쪽에 평균
단어 갯수의 분포를 이용해서 훈련에 사용할 독립변수 각 값들의 길이 기준 정의 전체적으로 왼쪽편에 집중되어 있으며, x축 125 정도에 많은 빈도를 나타내고 있음 따라서, 독립변수 각 값들의 길이를 100으로 통일(정규화)
259개의 단어 중 100개만 남기고 날리기 앞에서 부터 단어 100개(평가하는 단어를 뒤쪽에 썼을거라는 생각) 단어가 100개가 안되는 문장은 100개가 되도록 빈자리는 0으로 채움
각 데이터의 길이를 100으로 통일(정규화) 시키기
''' 텍스트 길이 정규화 라이브러리 '''
from tensorflow.keras.preprocessing.sequence import pad_sequences
''' 훈련 독립변수 각 데이터 100개로 통일시키기
- pad_sequences() : 텍스트의 길이를 maxlen 갯수로 통일시키기
- maxlen보다 작으면 0으로 채우고, 크면 제거한다.
'''
train_seq = pad_sequences(train_input, maxlen=100)
train_seq.shape
텍스트 길이 조정 속성(매개변수) - truncating → 추출 위치(앞 또는 뒤부터) → pre 뒤쪽부터 추출하기 (기본값), 앞쪽 제거하기 → post 앞쪽부터 추출하기, 뒤쪽 제거하기 - padding → 채울 위치(앞 또는 뒤부터) → pre 앞쪽을 0으로 채우기 (기본값) → post 뒤쪽을 0으로 채우기
계층 생성 및 모델에 추가하기 - input_shape=(100, 500) : 100은 특성 갯수, 500은 말뭉치 갯수
''' 계층 생성 및 모델에 추가하기
- input_shape=(100, 500) : 100은 특성 갯수, 500은 말뭉치 갯
'''
''' 입력계층이면서 RNN 계층 '''
model.add(keras.layers.SimpleRNN(8, input_shape=(100, 500)))
''' 출력계층 '''
model.add(keras.layers.Dense(1, activation="sigmoid"))
원-핫(One - Hot) 인코딩
📍 RNN에서 사용할 독립변수 처리 방식 - RNN 모델에서는 독립변수의 데이터를원-핫 인코딩데이터 또는임베딩 처리를 통해서 훈련을 시켜야 한다
📍 원-핫(One-Hot) 인코딩 방식 - 각 데이터(값) 중에 1개의 단어당 분석을 위해 500개의 말뭉치와 비교하여야 함 - 이때 비교하기 위해 원-핫 인코딩으로 변환하여 비교하는 방식을 따름 - keras.util.to_categorical() 함수 사용 - 프로그램을 통해 변환해야 함(별도 계층이 존재하지는 않음) - 각 단어별로 원-핫인코딩 처리가 되기에 데이터가 많아지며, 속도가 느림 - 데이터가 많아지기 떄문에 많은 메모리 공간을 차지함
📍 단어 임베딩(Embedding) 방식 - 원-핫 인코딩의 느린 속도를 개선하기 위하여 개선된 방식(메모리 활용) - 많은 공간을 사용하지 않음 - keras.layers.Embedding() 계층을 사용함(프로그램 처리 방식이 아님)
''' 자동 저장 및 종료하는 콜백함수 정의하기 '''
model_path = "./model/best_simpleRNN_model.h5"
''' 모델 자동 저장 콜백함수 '''
checkpoint_cb = keras.callbacks.ModelCheckpoint(model_path)
''' 자동 종료 콜백 함수 '''
early_cb = keras.callbacks.EarlyStopping(patience=3, restore_best_weights = True)
checkpoint_cb, early_cb
모델 훈련하기 - batch_size : 훈련 시 데이터를 배치사이즈 만큼 잘라서 종속변수와 검증 진행 → 배치사이즈 만큼 종속변수와 비교 시 틀리게 되면, 다음 배치사이즈에서 오류를 줄여가면서 훈련을 진행하게 된다 → 배치사이즈의 값을 정의하지 않으면 전체 데이터를 기준으로 종속변수와 비교 및 훈련 반복 시 오류 조정 진행 된다 → 배치사이즈의 값은 정의된 값은 없으며, 보통 32, 64 정도로 주로 사용함 → 튜닝 대상 하이퍼파라미터 변수