일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- BERT
- 추천시스템
- MSCS
- 머신러닝
- 머신러닝 파이프라인
- MLOps
- Collaborative Filtering Bandit
- 클라우드
- HTTP
- 언어모델
- BANDiT
- 중국플랫폼
- COFIBA
- docker
- nlp
- 미국석사
- transformer
- 자연어처리
- AWS
- RecSys
- 네트워크
- 플랫폼
- aws자격증
- MAB
- TFX
- BERT이해
- llm
- 클라우드자격증
- 메타버스
- chatGPT
Archives
- Today
- Total
Julie의 Tech 블로그
딥러닝 기초 - Keras API 사용 없이 small DNN 구현하기 본문
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모델을 만든 것을 확인해볼 수 있다.
반응형
'Tech > ML, DL' 카테고리의 다른 글
GBM 모델 : lightGBM vs XGBoost (0) | 2021.05.14 |
---|---|
앙상블 - 배깅과 부스팅, GBM(Gradient Boosting) 알고리즘 (0) | 2021.05.14 |
딥러닝 기초 - 노드와 퍼셉트론 (0) | 2021.05.13 |
Kaggle Case Study - (2) LightGBM 모델 (0) | 2021.05.13 |
딥러닝 기초 - Keras 함수형 API, callback (0) | 2021.05.13 |