딥러닝

Keras를 활용한 RNN 모델 구현

샌쥬 2025. 1. 18. 18:28
import numpy as np
import tensorflow as tf
from keras.datasets import imdb
from keras.preprocessing import sequence

import logging, os
logging.disable(logging.WARNING)
os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3"

np.random.seed(0)
tf.random.set_seed(0)

np_load_old = np.load
np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)

# 데이터를 불러오고 전처리하는 함수입니다.

def load_data(n_of_training_ex, n_of_testing_ex, max_review_length):
   
    PATH = "./data/"
   
    X_train = np.load(PATH + "X_train.npy")[:n_of_training_ex]
    y_train = np.load(PATH + "y_train.npy")[:n_of_training_ex]
    X_test = np.load(PATH + "X_test.npy")[:n_of_testing_ex]
    y_test = np.load(PATH + "y_test.npy")[:n_of_testing_ex]
   
    X_train = sequence.pad_sequences(X_train, maxlen=max_review_length)
    X_test = sequence.pad_sequences(X_test, maxlen=max_review_length)
   
    return X_train, y_train, X_test, y_test
   
'''
1. SimpleRNN을 적용할 하나의 모델을 자유롭게 생성합니다.
'''
   
def SimpleRNN(embedding_vector_length, max_review_length):
   
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Embedding(input_dim = 1000,output_dim=embedding_vector_length,
    input_length = max_review_length))
    model.add(tf.keras.layers.SimpleRNN(units = 5,activation = 'tanh'))
    model.add(tf.keras.layers.Dense(1,activation = 'sigmoid'))
   
    return model

'''
2. LSTM을 적용할 하나의 모델을 자유롭게 생성합니다.
'''

def LSTM(embedding_vector_length, max_review_length):
   
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Embedding(input_dim = 1000,output_dim=embedding_vector_length,
    input_length = max_review_length))
    model.add(tf.keras.layers.LSTM(units = 5,activation = 'tanh'))
    model.add(tf.keras.layers.Dense(1,activation = 'sigmoid'))
   
    return model

'''
3. GRU를 적용할 하나의 모델을 자유롭게 생성합니다.
'''

def GRU(embedding_vector_length, max_review_length):
   
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Embedding(input_dim = 1000,output_dim=embedding_vector_length,
    input_length = max_review_length))
    model.add(tf.keras.layers.GRU(units = 5,activation = 'tanh'))
    model.add(tf.keras.layers.Dense(1,activation = 'sigmoid'))
   
   
    return model

'''
4. 세 모델을 불러온 후 학습시키고 테스트 데이터에 대해 평가합니다.

   Step01. SimpleRNN, LSTM, GRU 함수를 이용해 세 모델을 불러옵니다.
   
   Step02. 세 모델의 손실 함수, 최적화 알고리즘, 평가 방법을 설정합니다.
   
   Step03. 세 모델의 구조를 확인하는 코드를 작성합니다.
   
   Step04. 세 모델을 각각 학습시킵니다. 검증용 데이터는 설정하지 않습니다.
           세 모델 모두 'epochs'는 3, 'batch_size'는 256으로 설정합니다.
   
   Step05. 세 모델을 테스트하고 각각의 Test Accuracy 값을 출력합니다.
           셋 중 어느 모델의 성능이 가장 좋은지 확인해보세요.
'''

def main():
   
    max_review_length = 300
    embedding_vector_length = 32
   
    n_of_training_ex = 25000
    n_of_testing_ex = 3000
   
    X_train, y_train, X_test, y_test = load_data(n_of_training_ex, n_of_testing_ex, max_review_length)
   
    model_simple_rnn = SimpleRNN(embedding_vector_length, max_review_length)
    model_lstm = LSTM(embedding_vector_length, max_review_length)
    model_gru = GRU(embedding_vector_length, max_review_length)
   
    model_simple_rnn.compile(loss = 'binary_crossentropy',metrics=['Accuracy'],optimizer = 'adam')
    model_lstm.compile(loss = 'binary_crossentropy',metrics=['Accuracy'],optimizer = 'adam')
    model_gru.compile(loss = 'binary_crossentropy',metrics=['Accuracy'],optimizer = 'adam')
   
    model_simple_rnn.summary()
    model_lstm.summary()
    model_gru.summary()
   
    model_simple_rnn_history = model_simple_rnn.fit(X_train,y_train,epochs=3,batch_size=256)
    print('\n')
    model_lstm_history = model_lstm.fit(X_train,y_train,epochs=3,batch_size=256)
    print('\n')
    model_gru_history = model_gru.fit(X_train,y_train,epochs=3,batch_size=256)
   
    scores_simple_rnn = model_simple_rnn.evaluate(X_test, y_test, verbose=0)
    scores_lstm = model_lstm.evaluate(X_test, y_test, verbose=0)
    scores_gru = model_gru.evaluate(X_test, y_test, verbose=0)
   
    print('\nTest Accuracy_simple rnn: ', scores_simple_rnn[-1])
    print('Test Accuracy_lstm: ', scores_lstm[-1])
    print('Test Accuracy_gru: ', scores_gru[-1])
   
    return model_simple_rnn_history, model_lstm_history, model_gru_history

if __name__ == '__main__':
    main()

'딥러닝' 카테고리의 다른 글

단어 임베딩  (0) 2025.01.19
텍스트 전처리  (0) 2025.01.19
순환 신경망(RNN) 모델 파이썬으로 구현하기  (0) 2025.01.18
Keras로 CNN 구현하기  (0) 2025.01.15
one hot 인코딩  (0) 2025.01.15