본문 바로가기

ML & AI Theory

tf.keras API. Sequential 모델 실습

반응형

1. Sequential 모델

 

Sequential 모델은 층을 순서대로 쌓는 모델을 만듭니다. 

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)

def make_random_data():
    x = np.random.uniform(low=-2, high=2, size=200)
    y = []
    
    for t in x:
        r = np.random.normal(loc=0.0, scale=(0.5+t*t/3), size=None)
        y.append(r)
        
    return x, 1.726*x -0.84 + np.array(y)

    
x, y = make_random_data()
plt.plot(x, y,'o')
plt.show()

 

전체 샘플 개수는 200개로 이 중 일부를 트레인과 테스트로 분류합니다.

x_train, y_train = x[:150], y[:150]
x_test, y_test = x[150:], y[150:]

 

이제부터 모델을 만들어 보겠습니다. 1차원 데이터셋이므로 출력 유닛 하나를 가진 간단한 완전 연결층 하나를 추가하겠습니다.

import tensorflow as tf
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(units=1, input_dim=1))
model.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 1)                 2         
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
_________________________________________________________________

 

유닛이 하나뿐이므로 모델 파라미터 개수는 가상치와 절편 두 개뿐입니다. 이제 모델을 컴파일하고 훈련 세트에서 학습시켜 보겠습니다.

model.compile(optimizer='sgd', loss='mse')
history = model.fit(x_train, y_train, epochs=500, validation_split=0.3)

compile()메서드의 loss매개변수에 회귀 문제를 위한 평균 제곱 오차(MSE) 손실 함수 'mse'를 선택했습니다. 회귀 문제에는 이외에도 평균 절댓값 오차(MAE) 손실 함수인 'mae'를 지정할 수도 있습니다. 이전에 다중 클래스 분류 문제를 위해 범주형 크로스 엔트로트 'categorical_crossentropy'를 사용해 보았습니다. 이진 분류 문제에는 이진 크로스 엔트로피 'binary_crossentropy'를 선택합니다. optimizer 매개변수에는 경사 하강법 옵티마이저를 지정합니다. SGD클래스의 기본값은 학습률 lrdl 0.001이고 momentum과 decay는 0입니다. 이외에도 인기 있는 여러 종류의 옵티마이저를 선택할 수 있습니다. 가령 RMSprop 알고리즘을 위한 'rmsprop', Adagrad는 'adagrad', Adam은 'adam'을 선택합니다. 

 

fit()메서드에서 검증 세트 크기를 30%로 설정했습니다. (validation_split=0.3). 훈련 과정을 출력해 주는 verbose매개변수의 기본값은 1로 진행바와 함께 검증 점수를 출력해 줍니다.

 

fit()메서드에서 반환받은 History객체의 history딕셔너리에는 에포크마다 계산한 손실 함수값이 저장되어 있습니다. 훈련 세트에 대한 손실 함수 값은 'loss'키에 담겨 있습니다. 

epochs = np.arange(1, 500+1)
plt.plot(epochs, history.history['loss'], label='Training loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

 


2. 함수형 API

 

Sequential 모델은 층을 순서대로 쌓는 모델을 만듭니다. 이보다 더 복잡한 모델을 만들어야 할 때가 있습니다. tf.keras의 함수형 API(functional API)는 다양한 토폴로지(topology)의 네트워크를 만들 수 있습니다. 함수형 API에서는 입력과 출력 사이에 원하는 층을 자유롭게 조합할 수 있습니다. 

 

import tensorflow as tf
from tensorflow.keras import Model, Input

input = tf.keras.Input(shape=(1,))
output = tf.keras.layers.Dense(1)(input)

Dense층의 객체(dense)를 네트워크의 다른 부분에 재사용하지 않는다면 (즉, 이 층의 가중치를 공유하지 않는다면) 객체 생성과 동시에 호출하는 것이 편리합니다. 그다음 Model 클래스에 입력과 출력을 전달하여 신경망 모델을 만듭니다.

 

model = tf.keras.Model(input, output)
model.summary()
Model: "model_2"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 1)]               0         
_________________________________________________________________
dense (Dense)                (None, 1)                 2         
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
_________________________________________________________________

이전과 동일하게 두 개의 모델 파라미터를 가진 Dense층 하나로 이루어져 있습니다. Sequential모델에서는 없었던 InputLayer는 입력 데이터를 위한 층입니다. 이 층은 학습되는 파라미터를 가지고 있지 않습니다.   

 

model.compile(optimizer='sgd', loss='mse')
history = model.fit(x_train, y_train, epochs=500, validation_split=0.3)

 

이번에는 검증 세트에 대한 손실 'val_loss'도 확인해보겠습니다. 

epochs = np.arange(1, 500+1)
plt.plot(epochs, history.history['loss'], label='Training loss')
plt.plot(epochs, history.history['val_loss'], label='Validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

 

반응형