ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Keras] 튜토리얼5 - summery()로 모델 구조 확인
    💫 Computer Science/Python & AI Framework 2019. 12. 18. 00:07

    ● Sequential Model

     

    Dense레이어로만 구성한 Sequential모델의 예

     

    Sequential 모델은 레이어들이 일렬로 쭉 나열된 형태이며 쉽게 레이어 구성할 수 있습니다. 그래서 Sequential모델의 summery를 보고 모델 구조를 파악하는 연습을 해보도록 하겠습니다. input_dim(혹은 input_shape)에서 받은 노드 갯수를 그대로 입력으로, Dense(5)와 Dense레이어 모델의 파라미터 값으로 준 값을 그대로 아웃풋의 갯수로 받습니다.

     

     

    예제 코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from keras.models import Sequential
    from keras.layers import Dense
    import numpy as np
     
    = np.array([1,2,3,4,5])
    = np.array([1,2,3,4,5])
    x2 = np.array([11,12,13,14,15])
     
    model = Sequential()
    model.add(Dense(5, input_dim=1, activation='relu'))
    model.add(Dense(3))
    model.add(Dense(1))
     
    model.summary()
    cs

     

     

    model.add(Dense(5, input_dim=1, activation='relu'))

     

    첫번째 레이어는 인풋레이어로 입력 노드 값이 1, 출력 노드 값이 5인 형태입니다.

     

     

    model.add(Dense(3))

     

    두번째 레이어는 앞의 레이어의 출력값을 그대로 입력을 받게 되므로 입력 값은 5, 출력 값은 3이 됩니다.

     

     

    model.add(Dense(1))

     

    세번째 레이어는 입력3, 출력1

     

     

    위 모델을 그림으로 표현해보면 다음과 같습니다.

     

    예제코드의 모델

     

     

     

    model.summary()

     

    구현한 위 모델을 확인해봅시다.

     

    model.summery()

    • Layer(type) :

    레이어의 이름타입을 나타냅니다. 알아서 레이어의 이름을 지정해줍니다. 따로 지정해주고 싶을때는 Dense에 파라미터로 name='지정하고싶은 이름'을 주면 됩니다. dense_1, dense_2, dense_3 이라고 이름 붙여진 3개의 Dense레이어가 생성된 것을 볼 수 있습니다.

     

    • Output Shape:

    (None, 5)이라는 뜻은 None개의 행과 5개의 아웃풋 값이 주어졌다는 것을 뜻합니다. 행이 None으로 지정되는 이유는 데이터의 갯수는 계속해서 추가될 수 있기 때문에 딥러닝 모델에서는 주로 행을 무시하고 열의 shape을 맞추어주는 작업을 많이 수행합니다. 첫번째 레이어의 아웃풋 갯수는 5, 두번째 레이어의 아웃풋 갯수는 3, 마지막 레이어의 아웃풋 갯수는 1임을 뜻합니다.

     

    • Param:

    파라미터의 수, 즉 각 입력노드와 출력노드에 대해 연결된 간선의 수를 뜻합니다. 

    첫번째 레이어는 인풋이 1개, 아웃풋이 5개 이므로 1*5=5개의 간선이 존재해야 하는데 10개의 간선이 있다고 표시되어 있습니다. 이유는 무엇일까요? 바로 인풋에 Bias(b) 노드가 추가되기 때문입니다.

    따라서 첫번째 레이어에는 입력값(1)+바이어스노드(1)=2 총 2개의 인풋 노드가 있으므로 파라미터의 갯수는 2*5로 10개가 되는 것입니다.

    마찬가지로 두번째 레이어에는 6*3=18개 세번째 레이어에는 4*1=4개의 파라미터가 존재하게 됩니다.

     

     

     

     

    y = Wx + b

    y = Wx + b에 대해서

    선형 그래프를 그리는 경우 H(x) = Wx + b로 표현할 수 있습니다. 이 방정식을 가설(Hypothesis)이라고 합니다. 선의 모양은 W와 b에 따라서 다르게 나타나며 어떤 그래프가 가장 정확한 값을 예측할 수 있을지 알아내는 방법이 중요하게 됩니다.

    여기서 W는 직선의 기울기가 되고 b는 y축을 지나는 'y 절편'이 됩니다. 여기서 x 값은 독립변수고 y값은 종속 변수입니다. 즉, x 값에 따라 y 값은 반드시 달라집니다. 다만, 정확하게 계산하려면 상수 W와 b의 값을 알아야합니다. 따라서 직선을 훌륭하게 그으려면 직선의 기울기 a 값과 y 절편 b 값을 정확히 예측해 내야 하는 것입니다. 

    선형 회귀는 정확한 직선을 그려내는 과정입니다. 바꿔말하면, 선형 회귀는 결국 최적의 W 값과 b 값을 찾아내는 작업이라고 할 수 있습니다.

    - 공부한 시간(x) 평균 : (10 + 9 + 3 + 2) / 4 = 6

    - 성적(y) 평균 : (90 + 80 + 50 + 30) / 4 = 62.5

     

    위를 a 식에 대입하면 결과는 7.7입니다.  7.7이 바로 기울기입니다.

     

    다음은 y 절편인 b를 구해보겠습니다. y의 평균에서 x의 평균과 기울기의 곱을 빼면 b의 값이 나온다는 의미입니다. 우리는 이미 y의 평균에서 x의 평균과 기울기 a까지, 이 식을 풀기 위해 필요한 모든 변수를 알고 있습니다. 이 식을 대입하면 16.3이 나옵니다.

    y 절편 b는 16.3가 나왔고 예측 값을 구하기 위한 직선의 방정식이 완성될 수 있습니다.

     

    이 식에 우리가 가진 데이터 값을 대입했을때 나오는 y 값을 '예측 값'이라고 할 수 있습니다.


    출처

     

     

     

     

     

     

    ● Dense Layer

    : Dense완전연결계층으로 여러 레이어들 중 하나이며 가장 대표적인 레이어입니다.

     

    여러 레이어를 혼합한 모델

     

    Dense레이어 외에도

     

    • Activation : 활성화 레이어
    • Dropout : 드롭아웃 레이어
    • BatchNormalization : 배치 정규화
    • Convolution2D : 콘볼루션 레이어
    • MaxPooling2D : Max풀링 레이어
    • LSTM, SimpleRNN, GUR : RNN 레이어

     

    와 같은 다양한 레이어들이 존재합니다. 이를 이용해 다양한 모델을 구성하거나 이전에 구성했던 모델을 불러와서 재사용, 추가 등을 할 수도 있고 차근차근 다뤄볼 예정입니다. 이를 이용해 다양한 모델을 구성하면 위 예제와 같이 파라미터로 준 값이 입력, 출력 노드개수 그대로 출력되지 않는 경우도 많습니다. 그때는 또 summery를 보는 방법이 달라지게 됩니다. 

     

     

     

     

    예제 코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from keras.models import Sequential
    from keras.layers import Dense
    import numpy as np
     
    = np.array([1,2,3,4,5])
    = np.array([1,2,3,4,5])
    x2 = np.array([11,12,13,14,15])
     
    model = Sequential()
    model.add(Dense(5, input_dim=1, activation='relu'))
    model.add(Dense(3))
    model.add(Dense(4))
    model.add(Dense(1))
     
    model.summary()
    cs

     

    네번째 레이어에 model.add(Dense(4))를 추가해보았습니다.

     

    결과

     

    레이어가 하나 더 생성되었고 총 파라미터의 개수도 증가한 것을 볼 수 있습니다.

    이렇게 간단한 Sequential Model의 구조를 summery()를 이용하여 확인하는 방법을 알아보았습니다.

    사실 간단한 모델의 경우 summery로 확인을 하지 않아도 금방 눈에 들어오지만,

    서로 다른 모델을 연결한 모델이나 복잡한 모델의 경우 shape을 맞추기 위해 또는 구조를 확인하기 위해 summery()를 사용할 수 있습니다.

     

    댓글

Designed by Tistory.