프로그래밍/인공지능
RNN - LSTM & CNN
austag
2023. 8. 1. 06:40
이번엔 LSTM과 CNN의 조합으로 영화 리뷰를 분류해보겠습니다.
데이터는 인터넷 영화 데이터베이스(Internet Movie DataBase, IMDB)를 사용합니다. 이 데이터는 영화와 관련된 정보와 출연진 정보, 개봉 정보, 영화 후기, 평점까지 매우 폭넓은 데이터가 저장된 자료입니다. 약 2만 5천여 개의 영화 리뷰가 담겨 있으며, 긍정적인지 부정적인지 구별이 되어있습니다.
마찬가지로 데이터 전처리 후 모델을 만들어 정확도를 구해보겠습니다.
1. 데이터 전처리
#학습셋, 테스트셋으로 나누기
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=5000)
#단어 수 맞추기
X_train = sequence.pad_sequences(X_train, maxlen=500)
X_test = sequence.pad_sequences(X_test, maxlen=500)
2. 모델 설정
#모델 설정
model = Sequential()
model.add(Embedding(5000, 100))
model.add(Dropout(0.5))
model.add(Conv1D(64, 5, padding='valid', activation='relu', strides=1))
model.add(MaxPooling1D(pool_size=4))
model.add(LSTM(55))
model.add(Dense(1))
model.add(Activation('sigmoid'))
설정된 모델을 확인해주면
Conv1D와 MaxPooling1D 층을 추가주었는데요 Conv1D는 1차원 합성곱 층이고 MaxPooling1D도 마찬가지로 1차원 Maxpooling 층입니다.
Conv1D를 그림으로 나타내보면 아래와 같습니다.
MaxPooling1D를 표현하면 이렇게 되구요
전체코드와 출력은 이렇습니다.
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Embedding, LSTM, Conv1D, MaxPooling1D
from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.callbacks import EarlyStopping
import numpy as np
import matplotlib.pyplot as plt
#학습셋, 테스트셋으로 나누기
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=5000)
#단어 수 맞추기
X_train = sequence.pad_sequences(X_train, maxlen=500)
X_test = sequence.pad_sequences(X_test, maxlen=500)
#모델 설정
model = Sequential()
model.add(Embedding(5000, 100))
model.add(Dropout(0.5))
model.add(Conv1D(64, 5, padding='valid', activation='relu', strides=1))
model.add(MaxPooling1D(pool_size=4))
model.add(LSTM(55))
model.add(Dense(1))
model.add(Activation('sigmoid'))
#모델 컴파일
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
#조기 중단
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=3)
#모델 실행
history = model.fit(X_train, y_train, batch_size=40, epochs=100,
validation_split=0.25, callbacks=[early_stopping_callback])
#테스트 정확도 출력
print('\nTest Accuracy: %.4f' %(model.evaluate(X_test, y_test)[1]))
#오차 저장
y_vloss = history.history['val_loss']
y_loss = history.history['loss']
#그래프 표현
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c='red', label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c='blue', label='Trainset_loss')
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
epoch=5에서 자동중단 되었고 Accuracy 는 0.8770이 나왔군요.
이번글에선 LSTM과 CNN을 조합한 예제를 해보았습니다. CNN은 언제봐도 신기한거 같습니다...