

관련 용어
순환층에 있는 각 뉴런의 출력(은닉상태)는 서로에게 전달된다
순환층에 입력되는 샘플은 보통 2차원 이다 - ‘시퀀스 길이’와 ‘단어 표현’
주요 용어 - 시퀀스(Sequence): 하나의 샘플을 지칭한다
순환층은 기본적으로 마지막 타임스텝의 은닉 상태만 출력한다. 단, 순환층이 여러개 일때 ‘마지막 순환층’만 ‘마지막 타임스텝의 은닉 상태’를 출력하고, 나머지 순환층은 모든 타입스텝의 은닉 상태를 출력한다.
CNN처럼 RNN도 마지막에 밀집층을 두어 클래스를 분류한다 이진 분류 → 시그모이드 함수를 활성화 함수로 사용 다중 분류 → 소프트맥스 함수를 활성화 함수로 사용

토큰에서 특정 용도로 사용되는 정수들
토큰 형성 실습 코드
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()

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()

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