brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Apr 17. 2019

Python: m.l with Keras #7

영화 평론가, IMDB

매우 쉽게

Keras 기본 모델링 구조를 가지고 IMDB 예제를 설명한다.


여기서 주목해야 할 부분은

모델링이 아닌,

바로 과적합의 실제 모습이다.



from keras import models, layers

from keras import regularizers

import matplotlib.pyplot as plt


from keras.utils import to_categorical

from keras.datasets import imdb


시작부터 선언해야할 라이브러리 목록이 있다.



(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)


def vectorize_sequences(sequences, dimension=10000):

    results = np.zeros((len(sequences), dimension))

    for i, sequence in enumerate(sequences):

        results[i, sequence] = 1.0

    return results


x_train = vectorize_sequences(train_data)

x_test = vectorize_sequences(test_data)


y_train = np.asarray(train_labels).astype('float32')

y_test = np.asarray(test_labels).astype('float32')


실제 리뷰에 사용된 10000가지 상위 단어를 활용한 데이터셋을 만든다.

이 후에는 '임베딩'을 활용하여 더욱 세밀하게 모델링을 만들 수 있다.

 

훈련 데이터에 25000개 Sample을 활용한다. 

레이블도 25000개 정답을 가진다.


기본 베이스 모델을 활용하면 결과적으로...

과대적합이 발생한다.



original_model = models.Sequential()

original_model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))

original_model.add(layers.Dense(16, activation='relu'))

original_model.add(layers.Dense(1, activation='sigmoid'))


original_model.compile(optimizer='rmsprop',

                       loss='binary_crossentropy',

                       metrics=['acc'])


original_hist = original_model.fit(x_train, y_train,

                                   epochs=epochs,

                                   batch_size=512,

                                   validation_data=(x_test, y_test))


지금은 모델링이 그리 중요하지 않다.

왜냐하면 IMDB 예제를 확실히 학습시키려면 앞으로 배워고 익혀야할 부분들이 너무나도 많다.

쉽지 않은 예제이다.


여기서 주목할 부분은 바로 규제와 드랍이다.


드랍은 다음 부분에서 제대로 맛을 보고

우선 규제를 통한 과대적합을 예방하는 방법에 대해서 살펴보고

위의 날로 만들어진 모델과의 비교(손실율 차이)를 통해서

실제 과대적합을 눈으로 확인한다.



l1_model = models.Sequential()

l1_model.add(layers.Dense(8, kernel_regularizer=regularizers.l1(0.001), activation='relu', input_shape=(10000,)))

l1_model.add(layers.Dense(8, kernel_regularizer=regularizers.l1(0.001), activation='relu'))

l1_model.add(layers.Dense(8, kernel_regularizer=regularizers.l1(0.001), activation='relu'))

l1_model.add(layers.Dense(8, kernel_regularizer=regularizers.l1(0.001), activation='relu'))

l1_model.add(layers.Dense(8, kernel_regularizer=regularizers.l1(0.001), activation='relu'))

l1_model.add(layers.Dense(1, activation='sigmoid'))


l1_model.compile(optimizer='rmsprop',

                      loss='binary_crossentropy',

                      metrics=['acc'])


l1_model_hist = l1_model.fit(x_train, y_train,

                                       epochs=epochs,

                                       batch_size=512,

                                       validation_data=(x_test, y_test))


약간 지저분한 점이 있지만

극대화된 예제 구현을 위해서 심하게 규제를 넣었다.


총 50 Epochs 값으로 훈련을 시키고

그 결과를 그림으로 나타낸다.


+ 모양의 그래프가 날로 구현한 모델을 통해 얻은 검증 데이터에 대한 손실이다.

훈련이 반복 될 수록

그 값이 커지는 것을 알수 있다.

하지만 훈련 데이터에 대한 손실은 거의 0에 수렴한다.

그 차이가 매우 심하다.


하지만,

o 모양의 그래프는 어느정도 구간에서 수렴성을 갖는다.

실제로 훈련 데이터에 대한 손실과 차이가 크게 나타나지 않는다.

즉,

과대적합이 어느정도는 해결 되었음을 알 수 있다.


끝.

작가의 이전글 Python: m.l with Keras #6
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari