Tech/ML, DL
딥러닝 기초 - Keras API 사용 없이 small DNN 구현하기
Julie's
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모델을 만든 것을 확인해볼 수 있다.