2024. 8. 17. 12:33ㆍAI
텍스트 기반의 영화 리뷰를 입력으로 받아서, 긍정/부정 여부를 분류하는 신경망 구조
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 |