
📖 케라스 창시자에게 배우는 딥러닝 (프랑소와 숄레, 박해선, 길벗) 참고
IMDB 데이터셋은 인터넷 영화 데이터베이스로부터 가져온 5만 개의 리뷰들로, 25000개의 훈련 데이터, 25000개의 테스트 데이터로 나뉘어 있고 각각 50%의 부정 리뷰, 50%의 긍정 리뷰로 구성되어 있다.
IMDB 데이터셋을 활용하여 리뷰가 긍정인지 부정인지 분류하는 예제를 작성해보자!
from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words = 10000)
num_words = 10000 : 훈련 데이터에서 가장 자주 나타나는 단어 1만 개만 사용
>>> max([max(sequence) for sequence in train_data])
9999
num_words = 10000를 지정했기 때문에 단어 인덱스는 최대 9999이다.
숫자 리스트는 신경망에 들어갈 수 없기 때문에 리스트를 텐서로 바꿔줘야 한다. 원-핫 인코딩을 통해 0과 1의 벡터로 변환하는 방법을 사용한다. (다른 방법도 존재하지만 우선 지금은 이 방법으로 벡터를 만든다)
import numpy as np
def vectorize_sequences(sequences, dimension = 10000):
results = np.zeros((len(sequences), dimension))
# 크기가 (len(sequences), dimension)이고 모든 원소가 0인 행렬 생성
for i, sequence in enumerate(sequences):
results[i, sequence] = 1.0 # result[i]에서 특정 인덱스의 위치를 1로 만든다.
return results
X_train = vectorize_sequences(train_data)
X_test = vectorize_sequences(test_data)
y_train = np.asarray(train_labels).astype(float)
y_test = np.asarray(test_labels).astype(float)
입력 데이터가 벡터이고 레이블은 스칼라인 간단한 문제에서 잘 작동하는 네트워크는 relu activation을 사용한 완전 연결층을 그냥 쌓은 것이다.
우리는 긍정 혹은 부정으로 리뷰를 분류할 것이기 때문에 마지막 층은 확률을 출력하기 위해 시그모이드 활성화 함수를 사용한다. 시그모이드는 임의의 값을 0과 1사이로 압축한다.
from keras import models
from keras import layers
imdb = models.Sequential()
imdb.add(layers.Dense(16, activation = 'relu', input_shape = (10000,)))
imdb.add(layers.Dense(16, activation = 'relu'))
imdb.add(layers.Dense(1, activation = 'sigmoid'))
이진 분류 문제이기 때문에 binary_crossentropy 손실 함수를 사용하고 rmsprop 옵티마이저를 사용한다.
imdb.compile(loss = 'binary_crossentropy',
optimizer = 'rmsprop',
metrics = ['accuracy'])
훈련 데이터로부터 검증 데이터를 만들어 냈다.
X_valid = X_train[:10000]
partial_X_train = X_train[10000:]
y_valid = y_train[:10000]
partial_y_train = y_train[10000:]
512개의 샘플씩 미니 배치를 만들어 20번의 에포크동안 훈련을 시킨다.
hist_imdb = imdb.fit(partial_X_train, partial_y_train, epochs = 50,
batch_size = 512, validation_data = (X_valid, y_valid))
loss, accuracy = imdb.evaluate(X_test, y_test)
evaluate를 통해 모델을 검증한다.
학습시킨 모델을 사용하여 테스트 데이터를 예측해본다.
imdb.predict_classes(X_test)