목표 : 순환 신경망에서 빼놓을 수 없는 핵심기술인 LSTM 과 GRU셀을 사용한 모델을 만들어 보기
LSTM
LSTM (Long Short-Term Memory) : '단기기억'을 '오래' 기억하기
순환 신경망에서 빼놓을 수 없는 핵심 기술 LSTM 과 GRU 셀을 사용한 모델
SimpleRNN 보다 훨씬 계산이 복잡하다 그러나 성능은 뛰어남 순환 신경망에서 많이 채택된다.
일반적으로 기본 순환층은 긴 시퀀스를 학습하기 어렵다.
시퀀스가 길수록 순환되는 은닉상태에 담긴 정보가 희석되기 때문이다.
따라서 멀리 떨어져 있는 단어 정보를 인식하는데 어려울수 있다.
이를 위해 LSTM과 GRU셀이 등장했다.
IMDB 데이터 준비
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os, random
import tensorflow as tf
from tensorflow import keras
def set_seed(seed = 42):
tf.keras.utils.set_random_seed(seed)
# 학습모델 저장해볼거다
base_path = r'...'
# 이전 예제 처럼 IMDB 리뷰 데이터를 로드하고 훈련세트와 검증세트로 나눔
from keras.datasets import imdb
from sklearn.model_selection import train_test_split
VOCAB_SIZE = 500 # 사전 크기
(train_input, train_target), (test_input, test_target) = imdb.load_data(
num_words=VOCAB_SIZE)
train_input, val_input, train_target, val_target = train_test_split(
train_input, train_target, test_size=0.2, random_state=42)
# ↓ 각 샘플의 길이를 100에 맞추고 부족할때는 패딩을 추가
from keras.preprocessing.sequence import pad_sequences
max_len = 100
train_seq = pad_sequences(train_input, maxlen=max_len)
val_seq = pad_sequences(val_input, maxlen=max_len)
test_seq = pad_sequences(test_input, maxlen=max_len)
■ LSTM
tf.keras.layers.LSTM
https://www.tensorflow.org/api_docs/python/tf/keras/layers/LSTM
tf.keras.layers.LSTM | TensorFlow v2.16.1
Long Short-Term Memory layer - Hochreiter 1997.
www.tensorflow.org
# LSTM 셀을 사용한 순환층을 만들어 봅니다
# SimpleRNN 클래스를 LSTM 클래스로 바꾸기만 하면 된다
set_seed(42)
model = keras.Sequential(name = "LSTM_model")
model.add(keras.layers.Input(shape=(max_len,))) # (100, )
model.add(keras.layers.Embedding(VOCAB_SIZE, 16))
model.add(keras.layers.LSTM(units=8))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.summary()
"""
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type) ┃ Output Shape ┃ Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ embedding (Embedding) │ (None, 100, 16) │ 8,000 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ lstm (LSTM) │ (None, 8) │ 800 │
parameter 개수
LSTM에는 작은 셀이 4개 있으므로. SimpleRNN에 비해 정확히 *4
★LSTM의 파라미터 개수★
=> 4gates x units x (units + inputs + 1)
=> ex) 4 x 8 x (8 + 16 + 1) => 800
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense (Dense) │ (None, 1) │ 9 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
"""
# 모델 컴파일, 학습
# batch_size, epoch 는 동일
rmsprop = keras.optimizers.RMSprop(learning_rate=1e-4)
model.compile(optimizer=rmsprop, loss='binary_crossentropy',
metrics=['accuracy'])
checkpoint_cb = keras.callbacks.ModelCheckpoint(
os.path.join(base_path, 'best-lstm-model.keras'),
save_best_only=True)
early_stopping_cb = keras.callbacks.EarlyStopping(patience=3,
restore_best_weights=True)
history = model.fit(train_seq, train_target, epochs=100, batch_size=64,
validation_data=(val_seq, val_target),
callbacks=[checkpoint_cb, early_stopping_cb])
print('🟨 best_epoch: ', early_stopping_cb.best_epoch)
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend(['train', 'val'])
plt.show()
'AI > ML' 카테고리의 다른 글
| Word2Vec (1) | 2026.04.17 |
|---|---|
| 자연어 처리 (NLP) (0) | 2026.04.16 |
| LSTM(1) (1) | 2026.04.14 |
| 순환 신경망으로 IMDB 리뷰 분류하기 - Word embedding (단어 임베딩) (0) | 2026.04.13 |
| 순환 신경망으로 IMDB 리뷰 분류하기 (1) | 2026.04.12 |