ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Neurons and Layers - Neuron without activation - Regression/Linear Model | Advanced Learning Algorithm
    Machine Learning/Stanford ML Specialization 2024. 2. 3. 21:02

    Coursera Machine Learning Specialization > Supervised Machine Learning: Advanced Learning Algorithms > Neural Network Intuition

     

    이제, 실제로 뉴런(유닛)들과 레이어가 어떻게 작동을 하는지 알아보자. 특히, Course 1에서 regression과 linear모델, logistic model을 만들었던것처럼 해볼것이다. 이 랩에서는 Tensorflow(텐서플로우)를 사용했는데, 이 프레임워크를 이용해서 이 모델들이 어떻게 동작하는지 보도록 하자. Tensorflow는 Google에서 개발한 ML 패키지이다. 2019년에 Google은 Keras를 TensorFlow에 통합하고, TensorFlow 2.0을 출시했다. 먼저 필요한 라이브러리를 import 하고 로깅 세팅을 해주었다.

     

    import numpy as np
    import matplotlib.pyplot as plt
    import tensorflow as tf
    from tensorflow.keras.layers import Dense, Input
    from tensorflow.keras import Sequential
    from tensorflow.keras.losses import MeanSquaredError, BinaryCrossentropy
    from tensorflow.keras.activations import sigmoid
    from lab_utils_common import dlc
    from lab_neurons_utils import plt_prob_1d, sigmoidnp, plt_linear, plt_logistic
    plt.style.use('./deeplearning.mplstyle')
    import logging
    logging.getLogger("tensorflow").setLevel(logging.ERROR)
    tf.autograph.set_verbosity(0)

     

     

    import... 로 시작하거나 포함되어있는 줄들은 필요한 패키지를 Python에서 사용할 수 있도록 import 해주는 코드이다. 그리고 추후 눈으로 결과를 볼 수 있도록 Matplotlib을 import 했는데, 사용자 정의 파일을 사용해서 적용했다. 이는 수업 랩에서 제공해준 스타일이다.

    plt.style.use('./deeplearning.mplstyle')

     

     

    그리고 로깅 레벨도 세팅해주었는데, 로그 수준을 Error로 설정해서, 오류 메시지만 로그에 표시되도록 세팅해주었다. 

    logging.getLogger("tensorflow").setLevel(logging.ERROR)

     

    마지막으로, Tensorflow의 autograph 기능의 로그 또한, set_verbosity의 파라미터를 0으로 설정해 로그를 출력하지 않도록 설정했다.

    tf.autograph.set_verbosity(0)

     

     

    Neuron without activation - Regression/Linear Model

    Dataset

    이전 코스에서 사용했던 것인데, linear regression을 이용해서 집값을 예측하는 예시를 사용해보겠다.

    X_train = np.array([[1.0], [2.0]], dtype=np.float32)           #(size in 1000 square feet)
    Y_train = np.array([[300.0], [500.0]], dtype=np.float32)       #(price in 1000s of dollars)
    
    fig, ax = plt.subplots(1,1)
    ax.scatter(X_train, Y_train, marker='x', c='r', label="Data Points")
    ax.legend( fontsize='xx-large')
    ax.set_ylabel('Price (in 1000s of dollars)', fontsize='xx-large')
    ax.set_xlabel('Size (1000 sqft)', fontsize='xx-large')
    plt.show()

     

    먼저 X_train은 주택의 사이즈를 나타내는 인풋데이터이다. 첫번째는 1.0, 두번째 예시는 2.0이다. 두 숫자에 1000을 곱하면 집의 사이즈가 된다. 그리고 Y_train에는 숫자 1이 1000달러를 의미하는 숫자들이 들어가있다. 즉, 첫번째 집은 300,000 달러, 두번째 집은 500,000달러이다. 두 어레이 모두 소수점 형식으로 지정된다.

    X_train = np.array([[1.0], [2.0]], dtype=np.float32) #(size in 1000 square feet)
    Y_train = np.array([[300.0], [500.0]], dtype=np.float32) #(price in 1000s of dollars)

     

    이제, subplot 함수를 사용해서 그래프를 그릴 수 있는 Figure(fig)와 Axes(ax)를 생성했다. 이후, ax에 scatter plot을 생성해서 X_train과 Y_train을 각각 x축과 y축 데이터로 사용했다. 점의 형태는 'x' 모양이고 색상은 빨강('r')으로 지정했다. 이 점들을 Data Points 라는 레이블로 표시했다. 그리고 폰트 사이즈를 매우 큰 사이즈로 설정했다.

    fig, ax = plt.subplots(1,1)
    ax.scatter(X_train, Y_train, marker='x', c='r', label="Data Points")
    ax.legend( fontsize='xx-large')

     

    마지막으로 y축과 x축의 레이블을 지정해서, 각 축이 어떤값을 의미하는지 표기해주고, 설정한 모든 옵션과 데이터를 바탕으로 시각화된 그래프를 표기하도록 해주었다.

    ax.set_ylabel('Price (in 1000s of dollars)', fontsize='xx-large')
    ax.set_xlabel('Size (1000 sqft)', fontsize='xx-large')
    plt.show()

     

    결과는 아래와 같다.

    두 집이 가격에 따라 값도 다르단걸 시각적으로 보여주었다

     

    Regression/Linear Model 

    활성화가 없는 뉴런에 의해 구현된 함수는 Course 1의 Linear Regression과 동일하다.

    $$ f_{\mathbf{w},b}(x^{(i)}) = \mathbf{w}\cdot x^{(i)} + b \tag{1}$$

     

    우리는 하나의 뉴런, 또는 유닛으로 층을 정의하고, 이를 익숙한 Linear Regression 함수와 비교할 수 있다. TensorFlow와 Keras를 사용해서 Linear Regression Layer를 만들고, 이를 통해 Input 데이터에 대한 연산을 수행해보자.

    linear_layer = tf.keras.layers.Dense(units=1, activation = 'linear', )
    linear_layer.get_weights()
    a1 = linear_layer(X_train[0].reshape(1,1))
    print(a1)
    w, b= linear_layer.get_weights()
    print(f"w = {w}, b={b}")

     

    먼저 TensorFlow의 Keras AIP를 사용해서 Linear Layer를 생성했다. 이 레이어는 단일 유닛(뉴런)을 가지며 (units=1), 활성화 함수로 Linear Function('linear')를 사용한다. 이후, get_weights 함수를 이용해서 초기 가중치와 편향을 가져온다. 아직 훈련되어있지 않기 때문에 이 값들은 랜덤으로 설정되어 있거나, 기본 초기화 전략에 따라서 설정되어있다. 이후 배열의 첫번째 요소 X_train[0], 즉 [1.0]을 reshape(1,1)을 사용해서 형태를 변경한다. 이렇게 변경된 데이터를 linear layer에 전달해서 output을 계산하게 된다. 아웃풋은 아래와 같았다.

    tf.Tensor([[1.22]], shape=(1, 1), dtype=float32)

     

    이 output, a1은 input에 linear layer의 가중치와 편향이 적용된 결과이다. 1.22는 linear layer가 계산환 결과이고 shape=(1,1)는 결과가 1x1행렬임을 나타낸다. 그리고, 데이터 타입은 32비트 부동 소수점이다. 즉, 이 결과는 X_train[0], (1.0)을 입력으로 사용했을 때, 초기화된 가중치와 편향을 가진 Linear Layer가 1.22라는 Output을 출력한다는것을 의미한다. 이런 가중치와 편향은 훈련 과정에서 조정된다.

     

    결과는 하나의 tensor(array의 또다른 이름)이며, (1,1) 모양의 매트릭스 또는 하나의 값이다. 이제 weight(가중치)와 bias(편향)을 살펴보자. 이 가중치들은 작은 숫자들로 무작위로 초기화되고, 편향은 기본적으로 0으로 초기화 된다. 아래처럼 이 linear layer의 weight을 가져와서 프린트해보았다.

    w, b= linear_layer.get_weights()
    print(f"w = {w}, b={b}")

     

    결과는 아래와 같았다.

    w = [[1.72]], b=[0.]

    여기서 출력된 가중치는 1.72이고, 편향은 0이었다. 단일 입력 특성을 가진 Linear Regression Model은 하나의 가중치와 편향을 가질것이다. 이는 위에서 언급한 linear_layer와 일치한다. 이제 이 값들을 우리가 아는 값으로 지정해보자.

     

    set_w = np.array([[200]])
    set_b = np.array([100])
    
    # set_weights takes a list of numpy arrays
    linear_layer.set_weights([set_w, set_b])
    print(linear_layer.get_weights())

     

     

    여기서 가중치는 200으로, 편향은 100으로 설정했다. 그리고 set_weights함수를 다시 이용해서 지정된 값들을 확인해보았다. 아웃풋은 아래와 같았다.

    [array([[200.]], dtype=float32), array([100.], dtype=float32)]

     

    두 공식을 비교해보자.

    a1 = linear_layer(X_train[0].reshape(1,1))
    print(a1)
    alin = np.dot(set_w,X_train[0].reshape(1,1)) + set_b
    print(alin)

     

    a1은 첫번째 요소(1.0)를 선형 레이어에 입력으로 제공하고, 결과를 a1에 저장했다. 그리고 alin은 NumPy를 사용해서 동일한 선형 연산을 수행했고, 인풋과 가중치들의 sumProduct에다가 b를 더했다.

    tf.Tensor([[300.]], shape=(1, 1), dtype=float32)
    [[300.]]

     

    TensorFlow의 선형 레이어가 작동하는 방식과, NumPy를 사용해서 수행된 수동 계산이 일치함을 확인할 수 있었다. 이제 linear layer 또한 NumPy를 사용한 수동 계산이 동일한지 살펴보자.

    prediction_tf = linear_layer(X_train)
    prediction_np = np.dot( X_train, set_w) + set_b
    plt_linear(X_train, Y_train, prediction_tf, prediction_np)

     

    우선 prediction_tf 는 TensorFlow의 linear layer를 사용해서 데이터에 대한 예측을 수행하고, 이 결과가 저장된다. prediction_np는 NumPy를 사용해서 같은 예측을 수행한다. set_w와 set_b를 이용해서 sum product에 편향값을 더해주고, 이 결과를 저장하게 된다. 이제 랩에서 제공한 plt_linear 함수를 호출해서 두 예측 결과를 시각화했다. 

     

     

    TensorFlow의 Linear Layer와 NumPy를 사용한 수동 계산이 정확하게 동일한 예측 결과를 생성했다.

     

     

     

     

    Reference

    Coursera Machine Learning Specialization > Supervised Machine Learning: Advanced Learning Algorithms > Neural Network Intuition

     

    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

     

    댓글

Designed by Tistory.