[인공지능] 케라스 학습 기술 - 모델의 크기 축소

참조


모델의 크기 축소

  • 가장 단순한 방법
  • 모델의 크기를 줄인다는 것은 학습 파라미터의 수를 줄이는 것

데이터 준비

import enum
from tensorflow.keras.datasets import imdb
import numpy as np

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

def vectorize_seq(seqs, dim=10000):
    results = np.zeros((len(seqs), dim))
    for i, seq in enumerate(seqs):
        results[i, seq] = 1.

    return results

x_train = vectorize_seq(train_data)
x_test = vectorize_seq(test_data)

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

2가지의 모델 설정

# 2가지의 모델 설정

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model_1 = Sequential([Dense(16, activation='relu', input_shape=(10000,), name='input'),
                      Dense(16, activation='relu', name='hidden'),
                      Dense(1, activation='sigmoid', name='output')])

model_1.summary()

model_2 = Sequential([Dense(7, activation='relu', input_shape=(10000,), name='input2'),
                      Dense(7, activation='relu', name='hidden2'),
                      Dense(1, activation='sigmoid', name='output2')])

model_1.compile(optimizer='rmsprop',
                loss='binary_crossentropy',
                metrics=['acc'])

model_2.compile(optimizer='rmsprop',
                loss='binary_crossentropy',
                metrics=['acc'])

2개의 모델 학습

# 2개의 모델 학습

model_1_hist = model_1.fit(x_train, y_train,
                           epochs=20,
                           batch_size=512,
                           validation_data=(x_test, y_test))

model_2_hist = model_2.fit(x_train, y_train,
                           epochs=20,
                           batch_size=512,
                           validation_data=(x_test, y_test))

비교

  • model_2 (더 작은 모델)이 '조금 더 나중에' 과대적합 발생
  • 모델이 작을 수록, 조금 더 늦게 오버피팅 됨
# 비교
epochs = range(1, 21)
model_1_val_loss = model_1_hist.history['val_loss']
model_2_val_loss = model_2_hist.history['val_loss']

import matplotlib.pyplot as plt
plt.style.use('seaborn-white')

plt.plot(epochs, model_1_val_loss, 'r+', label='Model 1')
plt.plot(epochs, model_2_val_loss, 'bo', label='Model 2')

plt.xlabel('Epochs')
plt.ylabel('Validation Loss')
plt.legend()
plt.grid()

plt.show()


모델의 크기 축소(2)

모델 구성

# 모델 구성
model_3 = Sequential([Dense(1024, activation='relu', input_shape=(10000,), name='input3'),
                      Dense(1024, activation='relu', name='hidden3'),
                      Dense(1, activation='sigmoid', name='output3')])

model_3.compile(optimizer='rmsprop',
                loss='binary_crossentropy',
                metrics=['acc'])

model_3.summary()
Model: "sequential_2"
_________________________________________________________________
 Layer (type)                Output Shape              Param #
=================================================================
 input3 (Dense)              (None, 1024)              10241024

 hidden3 (Dense)             (None, 1024)              1049600

 output3 (Dense)             (None, 1)                 1025

=================================================================
Total params: 11,291,649
Trainable params: 11,291,649
Non-trainable params: 0

모델 학습

  • 시간 소요
# 모델 학습

model_3_hist = model_3.fit(x_train, y_train,
                           epochs=20,
                           batch_size=512,
                           validation_data=(x_test, y_test))

시각화

  • 볼륨이 큰 신경망일수록 빠르게 훈련 데이터 모델링 가능(학습 손실이 낮아짐)
  • 과대 적합에는 더욱 민감해짐
  • 이는 학습-검증 데이터의 손실을 보면 알 수 있음
# 시각화
model_3_val_loss = model_3_hist.history['val_loss']

plt.plot(epochs, model_1_val_loss, 'r+', label='Model 1')
plt.plot(epochs, model_2_val_loss, 'bo', label='Model 2')
plt.plot(epochs, model_3_val_loss, 'g--', label='Model 3')

plt.xlabel('Epochs')
plt.ylabel('Validation Loss')
plt.legend()
plt.grid()

plt.show()

728x90

이 글을 공유하기

댓글

Designed by JB FACTORY