DeepLearning_summary

[케라스 창시자에게 배우는 딥러닝] 신경망 시작하기-영화리뷰 분류

jiwoolee 2021. 1. 20. 02:20

영화 리뷰 분류: 이진 분류 예제

>> 리뷰 텍스트를 기반으로 영화 리뷰를 긍정, 부정으로 분류하기

 

 

 

 

 

 

 

 

 

keras 버전을 우선 맞추어주고 사용할 dataset을 불러온다.

from keras.datasets import imdb

(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000) 
#훈련 데이터에서 가장 자주 나타나는 단어 10,000개만 사용하겠다
#train_data와 test_data는 리뷰의 목록

Google Colab에서 실제로 시행하면 아래와 같이 Download가 보인다.

 

 

 

 

신경망에 숫자 리스트를 주입할 수 없으므로 리스트를 텐서로 바꾸어주어야 한다. 방법은 다음과 같다. 

  1. 같은 길이가 되도록 리스트에 패딩을 추가하고 (samples, sequence_length) 크기의 정수 텐서로 변환한다. 이 정수 텐서를 다룰 수 있는 층을 신경망의 첫 번째 층으로 사용합니다(Embedding 층을 말한다.
  2. 리스트를 원-핫 인코딩하여 0과 1의 벡터로 변환한다. ( 예를 들면 시퀀스 [3, 5]를 인덱스 3과 5의 위치는 1이고 그 외는 모두 0인 10,000차원의 벡터로 각각 변환 ). 그다음 부동 소수 벡터 데이터를 다룰 수 있는 Dense 층을 신경망의 첫 번째 층으로 사용한다.

 

 

지금 예제에서는 두번째 방법을 사용한다.

import numpy as np

def vectorize_sequences(sequences, dimension=10000):
    # 크기가 (len(sequences), dimension))이고 모든 원소가 0인 행렬을 만든다
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1.  # results[i]에서 특정 인덱스의 위치를 1로 만든다
    return results

# 훈련 데이터를 벡터로 변환
x_train = vectorize_sequences(train_data)
# 테스트 데이터를 벡터로 변환
x_test = vectorize_sequences(test_data)

위 함수를 통해 샘플은 다음과 같이 array형태로 바뀐다.

x_train[0]
>>> array([0., 1., 1., ..., 0., 0., 0.])



# 레이블을 벡터로 
y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')

 

 

 

 

 

 

 

 

 

이제 신경망을 구현해보자

from keras import models
from keras import layers

model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))

네트워크의 구조는 다음과 같다.

 

이진 분류 문제이고 신경망의 출력이 확률이기 때문에 binary_crossentropy 손실을 사용했다. 

rmsprop 옵티마이저와 binary_crossentropy 손실 함수로 모델을 설정하는 코드도 작성해 훈련하는 동안 정확도를 사용해 모니터링하자.

 

from keras import optimizers

model.compile(optimizer=optimizers.RMSprop(lr=0.001),
              loss='binary_crossentropy',
              metrics=['accuracy'])

 

 

 

 

 

 

 

련하는 동안 처음 본 데이터에 대한 모델의 정확도를 측정하기 위해 원본 훈련 데이터에서 10,000의 샘플을 이용해 검증 세트를 만들었다.

x_val = x_train[:10000]
partial_x_train = x_train[10000:]

y_val = y_train[:10000]
partial_y_train = y_train[10000:]

 

 

 

 512개 샘플씩 미니 배치를 만들어 20번의 에포크 동안 훈련시켜보자..

x_train y_train 텐서에 있는 모든 샘플에 대해 20번 반복하며 동시에 따로 떼어 놓은 10,000개의 샘플에서 손실과 정확도를 측정할 것이다.

history = model.fit(partial_x_train,
                    partial_y_train,
                    epochs=20,
                    batch_size=512,
                    validation_data=(x_val, y_val))
                    

 

학습 진행과 결과는 다음과 같다

 

 

매우 단순한 네트워크를 사용했지만 약 85%의 정확도를 얻어낸 것을 확인할 수 있다.