Julie의 Tech 블로그

딥러닝 기초 - Keras API 사용 없이 small DNN 구현하기 본문

Tech/ML, DL

딥러닝 기초 - Keras API 사용 없이 small DNN 구현하기

Julie's tech 2021. 5. 14. 11:14
728x90

이번 글에서는 Keras 고급형 함수를 사용하지 않고, 간단한 DNN을 구현하는 것을 해보려고 한다.

구현해볼 DNN 모형은 아래와 같이 2개의 데이터 인풋을 받아 1개의 hidden layer로 구성되어 있다.

input_dim = 2
hidden_layers = 1
learning_rate = 0.001

weight와 bias는 아래와 같이 tensorflow의 Variable로 구현할 수 있다.

weight는 (2,1)의 shape를 갖게 되고, bias는 hidden layer 수에 따라 1개 dimension을 갖게 된다.

w = tf.Variable(tf.random.uniform(shape=(input_dim, hidden_units)))
b = tf.Variable(tf.zeros(shape=(hidden_layers,)))

위 두 변수는 아래와 같이 x값과 함께 곱해져 반환하게 된다.

활성화함수는 ReLu를 사용하였다.

def predict(input):
   x = tf.matmul(input, w) + b
   x = tf.maximum(0, x)
   return x

손실함수/목적함수는 MSE를 사용하였다.

def mse_loss(labels, predictions):
    loss = tf.reduce_mean(tf.square(labels-predictions))
    return loss

학습하는 함수는 아래와 같이 로직을 구현할 수 있다.

def train(inputs, labels):
     with tf.GradientTape() as tape :
       predictions = predict(inputs)
       loss = mse_loss(labels, predictions)
       gradient_w, gradient_b = tape.gradient(loss, [w, b])
     w.assign(w - learning_rate * gradient_w) // 경사하강법으로 값 업데이트
     b.assign(b - learning_rate * gradient_b)
     return loss

tf.GradientTape()을 이용하여 weight와 bias에 대해 미분하여 각각이 loss에 영향을 미치는 영향도를 계산할 것이다. 그 결과값에 따라 경사하강법으로 weight와 bias를 업데이트하게 된다.

모델을 AND gate로 만들어 한 번 학습해보자.

inputs = np.array([0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32)
labels = np.array([0, 0, 0, 1])

학습을 여러 차례 진행하기 위해 epoch를 for 구문을 이용하여 구현해준다.

for epoch in range(100):
    for x, y in zip(inputs, labels):
        loss = train([x], [y]) 
    // 괄호를 씌우는 이유는 tensorflow 라이브러리가 batch를 받는다고 가정하고 있기 때문에 데이터가 1개일 경우 축을 추가
    print("Epoch {}: loss = {}".format(epoch+1, loss))

예측 결과를 출력해 보면, 첫 세 변수는 0에 가깝고, 나머지는 1에 가깝게 출력되는 것을 볼 수 있다.

predictions = predict(inputs)

test input을 랜덤으로 대량으로 생성하여 prediction해보면, 그 결과값을 scatter plot을 그리게 되면 하나의 선을 기준으로, 그 아래는 false, 위는 true를 뱉는 AND Gate모델을 만든 것을 확인해볼 수 있다.

반응형