Cha 9-1 순차 데이터와 순환 신경망

순차 데이터

순환 신경망 (Recurrent Neural Network)

Untitled

Untitled

관련 용어

순환 신경망 주요 개념

Cha 9-2 순환 신경망으로 IMDB 리뷰 분류하기

텍스트 데이터 전처리 기초

Untitled

토큰에서 특정 용도로 사용되는 정수들

  1. ‘0’: 패딩
  2. ‘1’: 문장의 시작
  3. ‘2’: 어휘 사전에 없는 토큰 cf. 어휘 사전: 훈련 세트에서 고유한 단어를 뽑아 만든 목록

토큰 형성 실습 코드

from tensorflow.keras.datasets import imdb
from sklearn.model_selection import train_test_split
from tensorflow.keras.preprocessing.sequence import pad_sequences

(train_input, train_target), (test_input, test_target) = imdb.load_data(num_words=500)
train_input, val_input, train_target, val_traget = train_test_split(train_input, train_target, test_size=0.2, random_state=42)

# 패딩을 하거나 데이터를 잘라서 각 시퀀스의 데이터 길이를 맞추어 준다
train_seq = pad_sequences(train_input, maxlen=100)

순환 신경망 실습

데이터 전처리 코드

from tensorflow.keras.preprocessing.sequence import pad_sequences
from sklearn.model_selection import train_test_split
from tensorflow.keras.datasets import imdb

(train_input, train_target), (test_input, test_target) = imdb.load_data(num_words=500)
train_input, val_input, train_target, val_traget = train_test_split(train_input, train_target, test_size=0.2, random_state=42)

# 패딩을 하거나 데이터를 잘라서 각 시퀀스의 데이터 길이를 맞추어 준다
train_seq = pad_sequences(train_input, maxlen=100)
val_seq = pad_sequences(val_input, maxlen=100)

train_oh = keras.utils.to_categorical(train_seq) # 정수 배열을 자동으로 '원핫 인코딩' 해준다
val_oh = keras.utils.to_categorical(val_seq)

keras를 이용한 RNN 구현

# sequential 클래스를 활용한 순환 신경망 형성
from tensorflow import keras

model = keras.Sequential()
model.add(keras.layers.SimpleRNN(8, input_shape=(100, 500))) 
# SimpleRNN 클래스로 '순환층'을 사용할 수 있다. 활성화함수는 tanh으로 기본 설정되어 있다
# 100은 샘플의 길이를 의미하고, 500은 전체 샘플에 존재하는 단어 종류의 개수를 의미한다
model.add(keras.layers.Dense(1, activation='sigmoid'))

model.summary()

캡처.PNG

RNN 모델 훈련

# 모델 최종 구현
rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model.compile(optimizer=rmsprop, loss='binary_crossentropy', metrics=['accuracy'])

# 콜백
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-simplernn-model.h5', save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True)

# 모델 훈련
history = model.fit(train_oh, train_target, epochs=100, batch_size=64, validation_data=(val_oh, val_target), callbacks=[checkpoint_cb, early_stopping_cb])

모델 훈련 결과

# '훈련 손실'과 '검증 손실' 시각화
import matplotlib.pyplot as plt

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()

Untitled

20 epoch 부터 validation data의 손실 함수 값의 감소가 둔해졌다. 따라서 20 epoch가 적당한 훈련 횟수로 해석할 수 있다.

단어 임베딩(word embedding)