-
Neural Network with NumPy | Advanced Learning AlgorithmMachine Learning/Stanford ML Specialization 2024. 2. 9. 23:16
이제 NumPy를 이용해서 Coffee Rosting 문제를 해결해보자. 먼저 Library들과 로깅 세팅을 해보자.
import numpy as np import matplotlib.pyplot as plt plt.style.use('./deeplearning.mplstyle') import tensorflow as tf from lab_utils_common import dlc, sigmoid from lab_coffee_utils import load_coffee_data, plt_roast, plt_prob, plt_layer, plt_network, plt_output_unit import logging logging.getLogger("tensorflow").setLevel(logging.ERROR) tf.autograph.set_verbosity(0)
이전의 TensorFlow 예시와 마찬가지로 필요한 라이브러리들과 데이터를 불러왔다.
Dataset
이제 사용할 데이터셋을 세팅하고 확인해보자. 이전 예시(TensorFlow)와 비슷하다.
X,Y = load_coffee_data(); print(X.shape, Y.shape)
(200, 2) (200, 1)
200개 샘플이 있는 데이터가 저장되었다. 한번 이미지로 확인해보자.
plt_roast(X,Y)
Normalization
이제 이 데이터들의 가중치를 비슷하게 맞추기 위해서 Normalization도 진행했다.
print(f"Temperature Max, Min pre normalization: {np.max(X[:,0]):0.2f}, {np.min(X[:,0]):0.2f}") print(f"Duration Max, Min pre normalization: {np.max(X[:,1]):0.2f}, {np.min(X[:,1]):0.2f}") norm_l = tf.keras.layers.Normalization(axis=-1) norm_l.adapt(X) # learns mean, variance Xn = norm_l(X) print(f"Temperature Max, Min post normalization: {np.max(Xn[:,0]):0.2f}, {np.min(Xn[:,0]):0.2f}") print(f"Duration Max, Min post normalization: {np.max(Xn[:,1]):0.2f}, {np.min(Xn[:,1]):0.2f}")
Temperature Max, Min pre normalization: 284.99, 151.32
Duration Max, Min pre normalization: 15.45, 11.51
Temperature Max, Min post normalization: 1.66, -1.69
Duration Max, Min post normalization: 1.79, -1.70데이터들이 너무 크지도 작지도 않게 비슷한 범위 내에서 분포되었다.
NumPy Model
먼저, g 함수를 정의하자. util library에 이미 정의된 sigmoid 함수를 사용하자.
# Define the activation function g = sigmoid
그리고 나서, 이전 시간에 공부했던대로 dense와 sequential 함수를 만들었다.
def my_dense(a_in, W, b): """ Computes dense layer Args: a_in (ndarray (n, )) : Data, 1 example W (ndarray (n,j)) : Weight matrix, n features per unit, j units b (ndarray (j, )) : bias vector, j units Returns a_out (ndarray (j,)) : j units| """ units = W.shape[1] a_out = np.zeros(units) for j in range(units): w = W[:,j] z = np.dot(w, a_in) + b[j] a_out[j] = g(z) return(a_out) def my_sequential(x, W1, b1, W2, b2): a1 = my_dense(x, W1, b1) a2 = my_dense(a1, W2, b2) return(a2)
자, 이제 Weights과 bias들을 이전 lab(TensorFlow)에서 사용했던 값들을 복사해서 사용해보자.
W1_tmp = np.array( [[-8.93, 0.29, 12.9 ], [-0.1, -7.32, 10.81]] ) b1_tmp = np.array( [-9.82, -9.28, 0.96] ) W2_tmp = np.array( [[-31.18], [-27.59], [-32.56]] ) b2_tmp = np.array( [15.41] )
Prediction
이제, 생성한 모델을 이용해서 예측을 하는 prediction 함수를 만들어보자.
def my_predict(X, W1, b1, W2, b2): m = X.shape[0] p = np.zeros((m,1)) for i in range(m): p[i,0] = my_sequential(X[i], W1, b1, W2, b2) return(p)
이제, 이전 랩과 같이 2가지 예시를 테스트 해보자. 한가지는 좋은 로스팅, 다른 한가지는 실패한 로스팅의 테스트 데이터셋이다.
X_tst = np.array([ [200,13.9], # postive example [200,17]]) # negative example X_tstn = norm_l(X_tst) # remember to normalize predictions = my_predict(X_tstn, W1_tmp, b1_tmp, W2_tmp, b2_tmp)
우리가 만든 my_predict 함수를 이용해서 예측을 하고, 결과값을 리턴했다. 이제 이 결과값을 threshold와 비교해서 decision making을 하도록 하자.
yhat = np.zeros_like(predictions) for i in range(len(predictions)): if predictions[i] >= 0.5: yhat[i] = 1 else: yhat[i] = 0 print(f"decisions = \n{yhat}")
decisions = [[1.] [0.]]
성공적으로 예측을 마쳤다.
Visualization
마지막으로, 이 모델을 시각화 해보자. 수업에서 주어진 util function을 이용해서 해볼 수 있다. 이전의 랩과 결과가 같이 아래와 같이 보여졌다.
netf= lambda x : my_predict(norm_l(x),W1_tmp, b1_tmp, W2_tmp, b2_tmp) plt_network(X,Y,netf)
Reference
Advanced Learning Algorithms
In the second course of the Machine Learning Specialization, you will: • Build and train a neural network with TensorFlow to perform multi-class ... 무료로 등록하십시오.
www.coursera.org
'Machine Learning > Stanford ML Specialization' 카테고리의 다른 글