AI/TensorFlow & PyTorch

[TensorFlow] RNN, LSTM, GRU를 이용한 영화 리뷰 감성 분석

byunghyun23 2023. 6. 8. 18:56

RNN, LSTM, GRU를 이용하여 imdb 영화 리뷰 감성 분석을 해보겠습니다.

 

import numpy as np
import tensorflow as tf

from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing import sequence

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, SimpleRNN, LSTM, GRU
from tensorflow.keras.layers import Embedding
from tensorflow.keras.layers import Dropout
from tensorflow.keras.layers import Conv1D
from tensorflow.keras.layers import MaxPooling1D

import matplotlib.pyplot as plt

# 랜덤 시드 설정
np.random.seed(0)
tf.random.set_seed(0)

# 데이터 불러오기
(X_tn0, y_tn0), (X_te0, y_test) = imdb.load_data(num_words=2000)

# 원본 데이터 차원 확인
print(X_tn0.shape)
print(y_tn0.shape)
print(X_te0.shape)
print(y_test.shape)

# 트레이닝/밸리데이션셋 분리
X_train = X_tn0[0:20000]
y_train = y_tn0[0:20000]
X_valid = X_tn0[20000:25000]
y_valid = y_tn0[20000:25000]

# 피쳐 데이터 형태 확인
print(X_train[0])

# 개별 피쳐 크기 확인
print(len(X_train[0]))
print(len(X_train[1]))

# 타겟 클래스 확인
print(set(y_test))
print(len(set(y_test)))

# 피쳐 데이터 변형
X_train = sequence.pad_sequences(X_train, maxlen=100)
X_valid = sequence.pad_sequences(X_valid, maxlen=100)
X_test = sequence.pad_sequences(X_te0, maxlen=100)


# LSTM 모형 생성
model = Sequential()
model.add(Embedding(input_dim=2000, output_dim=100))
model.add(Conv1D(50, kernel_size=3,
                 padding='valid',
                 activation='relu'))
model.add(MaxPooling1D(pool_size=3))
model.add(SimpleRNN(100))
# model.add(LSTM(100))
# model.add(GRU(100))
model.add(Dropout(0.25))
model.add(Dense(1, activation='sigmoid'))
model.summary()

# 모형 컴파일
model.compile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# 학습
hist = model.fit(X_train, y_train,
                 batch_size=100,
                 epochs=10,
                 validation_data=(X_valid, y_valid))

# 트레이닝 데이터 평가
print(model.evaluate(X_train, y_train)[1])
print(model.evaluate(X_valid, y_valid)[1])

# 테스트 데이터 평가
print(model.evaluate(X_test, y_test)[1])

# 정확도 학습 그래프
epoch = np.arange(1, 11)
acc_train = hist.history['accuracy']
acc_valid = hist.history['val_accuracy']
loss_train = hist.history['loss']
loss_valid = hist.history['val_loss']

plt.figure(figsize=(15, 5))
plt.subplot(121)
plt.plot(epoch, acc_train, 'b',
         marker='.',
         label='train_acc')
plt.plot(epoch, acc_valid, 'r--',
         marker='.',
         label='valid_acc')
plt.title('Accuracy')
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.legend()
plt.subplot(122)
plt.plot(epoch, loss_train, 'b',
         marker='.',
         label='train_loss')
plt.plot(epoch, loss_valid, 'r--',
         marker='.',
         label='valid_loss')
plt.title('Loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend()
plt.show()

 

RNN은 SimpleRNN(), LSTM은 LSTM(), GRU는 GRU()를 사용하면 됩니다.

모델 별 정확도는 다음과 같습니다.

Model Accuracy
RNN 0.8062
LSTM 0.8193
GRU 0.8220