RNN 긍정/부정 여부를 분류하는 신경망 구조

2024. 8. 17. 12:33AI

반응형

 

 

 

 텍스트 기반의 영화 리뷰를 입력으로 받아서, 긍정/부정 여부를 분류하는 신경망 구조

 5,000개의 단어로 이루어진 시퀀스가 입력으로 주어지고 각 단어는 32차원으로 임베딩된다.

각 LSTM은 64개의 유닛을 가지고 마지막 LSTM 레이어의 출력이 Fully-Connected 레이어와 연결된다.
시그모이드 함수 (Sigmoid Activation)로 출력 값을 0과 1 사이의 확률로 변환하여 영화 리뷰가 긍정일 확률을 계산한다.

from time import time
from keras.datasets import imdb
from keras.preprocessing.sequence import pad_sequences
from keras.models import Sequential
from keras.layers import Embedding, LSTM, Dense, Dropout

#하이퍼 파라미터
MY_LENGTH=80
MY_WORD=5000
MY_SAMPLE=5


(X_train, Y_train),(X_test, Y_test) =imdb.load_data(num_words=MY_WORD)
#샘플 영화평
print('샘플영화평:\n',X_train[MY_SAMPLE])
print('총 단어 수:\n',len(X_train[MY_SAMPLE]))
print('감성(0=부정,1=긍정):',Y_train[MY_SAMPLE])

X_train=pad_sequences(sequences=X_train,
                      truncating='post',
                      padding='post',
                      maxlen=MY_LENGTH)
X_test=pad_sequences(sequences=X_test,
                     truncating='post',
                     padding='post',
                     maxlen=MY_LENGTH)

# 학습용 입력 데이터 모양 출력
print('학습용 입력 데이터 모양:', X_train.shape)

# 학습용 출력 데이터 모양 출력
print('학습용 출력 데이터 모양:', Y_train.shape)

# 평가용 입력 데이터 모양 출력
print('평가용 입력 데이터 모양:', X_test.shape)

# 평가용 출력 데이터 모양 출력
print('평가용 출력 데이터 모양:', Y_test.shape)


 1. 입력 데이터 준비
- 입력 데이터: 영화 리뷰는 텍스트 데이터로, 이 텍스트를 분석하기 위해서는 먼저 숫자 형태로 변환이 필요한다. 일반적으로 각 리뷰는 고정된 길이의 단어 시퀀스로 표현되는데 최대 5,000개의 단어로 구성된 리뷰 시퀀스가 입력으로 주어진다.

 2. 임베딩 레이어 (Embedding Layer)
- 임베딩: 텍스트 데이터를 직접적으로 처리하기보다는 각 단어를 고정된 차원의 벡터로 변환한다. 이 과정은 임베딩 레이어에서 수행된다.
- 임베딩 차원: 각 단어는 32차원의 벡터로 표현된다. 이는 단어 간의 관계를 더 잘 표현하기 위해 고차원 공간에서 단어를 위치시키는 과정이다.

 3. LSTM 레이어 (Long Short-Term Memory)
- LSTM: LSTM은 순환 신경망(RNN)의 일종으로, 시퀀 스 데이터의 시간적(순차적) 정보를 유지하는 데 강점이 있다. 여기서는 LSTM 레이어를 사용하여 각 리뷰의 단어 순서와 문맥을 학습한다.
- 유닛 수: 각 LSTM 레이어는 64개의 유닛을 가지고 있으며, 이는 LSTM이 입력 데이터를 처리하는 데 사용하는 내부 차원의 크기를 의미한다. 이 유닛들은 시퀀스의 의미를 더 깊게 이해하고, 중요한 정보를 유지하면서 다음 단계로 전달한다.

 4. Fully-Connected 레이어
- 연결: LSTM 레이어에서 마지막으로 출력된 정보는 Fully-Connected (Dense) 레이어로 전달된다. 이 레이어는 모든 입력 노드와 출력 노드를 완전히 연결하여, 최종적으로 이 정보를 사용해 예측을 만든다.

model = Sequential()  # Sequential 모델을 초기화 레이어를 순차적으로 쌓을 때 사용하는 기본적인 모델
model.add(Embedding(input_dim=MY_WORD,
                    output_dim=32,
                    input_length=MY_LENGTH))  
# Embedding 레이어를 추가
# input_dim=MY_WORD: 사용할 단어의 수를 지정(단어 집합의 크기)
# output_dim=32: 각 단어를 32차원 벡터로 변환.
# input_length=MY_LENGTH: 입력 시퀀스의 길이를 지정

model.add(LSTM(units=64,
               input_shape=(MY_LENGTH, 32)))  
# LSTM(Long Short-Term Memory) 레이어를 추가
# units=64: LSTM 레이어의 뉴런 수를 지정 (출력의 차원)
# input_shape=(MY_LENGTH, 32): 입력 데이터의 형태를 지정 여기서는 시퀀스 길이와 Embedding 레이어의 출력 차원을 포함
model.add(Dense(units=1, activation='sigmoid'))  
# Dense 레이어(완전 연결 레이어)를 추가
# units=1: 출력 뉴런 수를 1개로 설정. 이는 이진 분류를 위한 설정


# activation='sigmoid': 출력에 시그모이드 활성화 함수를 사용하여 0과 1 사이의 값으로 변환

print('RNN')  

model.summary()


 5. 시그모이드 함수 (Sigmoid Activation)
- 출력 변환: Fully-Connected 레이어의 출력값은 시그모이드 활성화 함수로 전달된다. 시그모이드 함수는 출력값을 0과 1 사이의 확률 값으로 변환한다.
  - 0에 가까울수록 해당 리뷰가 부정적일 확률이 높고, 1에 가까울수록 긍정적일 확률이 높다.

 6. 최종 출력
- 결과: 모델의 최종 출력은 영화 리뷰가 긍정적인지 부정적인지의 확률이다. 이 확률을 통해 리뷰가 긍정적인지 부정적인지를 분류할 수 있다.

# 모델 컴파일
model.compile(optimizer='adam',  # Adam 옵티마이저를 사용하여 모델을 컴파일
              loss='binary_crossentropy',  # 이진 분류를 위한 손실 함수로 binary_crossentropy를 사용
              metrics=['accuracy'])  # 정확도를 평가 지표로 사용

print('RNN 학습 시작') 
# 학습 시작 시간 기록
begin = time()  # 현재 시간을 기록하여 학습 시작 시간을 저장합니다.

# 모델 학습
model.fit(x=X_train,  # 학습 데이터 X_train을 입력으로 사용
          y=Y_train,  # 학습 데이터 Y_train을 타겟으로 사용
          epochs=10,  # 전체 데이터셋을 10번 반복하여 학습
          batch_size=200,  # 한 번에 200개의 샘플을 사용하여 학습
          verbose=1)  # 학습 진행 상태를 출력

# 학습 종료 시간 기록
end = time()  

# 총 학습 시간 출력
print('총 학습 시간: {:.2f}초'.format(end - begin))  # 학습 시작 시간과 종료 시간의 차이를 계산하여 총 학습 시간을 출력

 

 

 

 

 

 

 

 

 

  • RNN 감성 예측:
    • RNN 감성 예측: 1
    • 모델이 이 영화 평에 대해 감성 분석을 수행한 결과, 1(긍정)으로 예측
  • 정답 (0=부정, 1=긍정):
    • 정답 (0=부정, 1=긍정): 1
    • 실제로 이 영화 평의 감성은 1(긍정)

 

반응형

'AI' 카테고리의 다른 글

1.x TensorFlow 텐서 선언 방법  (0) 2024.09.24
머신러닝 ML 분류 예측  (1) 2024.09.20
Rule-based | Data-driven 접근법  (0) 2024.08.26
AND gate  (0) 2024.08.26
임베딩(embedding)  (0) 2024.08.17