ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Keras] 튜토리얼1 - Sequential Model 구현
    💫 Computer Science/Python & AI Framework 2019. 12. 11. 00:11

    딥러닝의 회귀,, 선형,, 비선형,,, 이런 이론들을 일단 접어두고 튜토리얼을 무작정 구현하면서 케라스로 딥러닝 모델을 구현하는 방법에 대해 살짝 알아봅시다.

     

    개발 환경
    : 아나콘다 가상환경에 2.0.0버전의 텐서플로우와 케라스 설치,
      파이썬 3.7.4버전 비주얼 스튜디오 코드 IDE사용. 

     

    선형회귀 수식

     

    선형회귀모델을 사용해서 딥러닝을 구현한다는 뜻은 선형회귀 수식 Y = WX + B를 이용하여, X라는 입력자료와 Y라는 출력자료가 주어졌을 때 최적의 W,B를 구한다는 뜻이 됩니다. 여기서 X, Y는 정제된 데이터이며 사람이 해야할 일을 의미하는 것입니다. 우리는 잘 정제된 X, Y 데이터를 넣어주고 노드와 레이어를 구성하여 모델을 만들어주면 케라스 라이브러리는 알아서 최적의 W(Weight)와 B(Bias)를 찾아줍니다.

    결론은 사람은 정제된 데이터 x, y를 구하고 머신은 w,b를 구한다는 것입니다.

     

     

    이를 케라스를 통해 어떻게 구현되는지 튜토리얼 코드를 하나씩 살펴보겠습니다.

     

    •  Tutorial01.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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])
     
    model = Sequential()
    model.add(Dense(5, input_dim=1, activation='relu'))
    # input 1 output 5
    model.add(Dense(3))
    model.add(Dense(1))
     
    model.compile(loss='mse', optimizer='adam')
    model.fit(x, y, epochs=100, batch_size=1)
     
    mse = model.evaluate(x, y, batch_size=1)
    print('mse : ', mse)
    cs

     

     

     

    from keras.models import Sequential
    from keras.layers import Dense

     

    먼저 우리는 keras의 models과 layers라는 이름을 가진 라이브러리 내의 Sequential과 Dense라는 오브젝트를 사용하기 위해 위 모델들을 임포트 시켜줍니다.

     

     

    import numpy as np

     

    또 numpy의 기능들을 사용하기 위해 numpy도 임포트를 시켜주었고, 이제부터 numpy의 기능들을 불러올때는 간결하게 'np'만 사용하여 간단하게 불러줄 것입니다. ex) np.array()

     

     

    = np.array([1,2,3,4,5])
    = np.array([1,2,3,4,5])

     

    우리의 입력과 출력 데이터들 입니다. 연습용이므로 입력데이터와 출력데이터는 같게 하였습니다.

    위 데이터들의 최적의 w는 1

     

     

    model = Sequential()

     

    Seqeuntial모델 오브젝트를 model이라는 변수 안에 넣고, 모델 구성을 시작합니다.

     

     

     

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

     

    input_dim = 1, 입력 차원이 1이라는 뜻이며 입력 노드가 한개라고 생각하면 됩니다.

    만약 x배열의 데이터가 2개라면 2, 3개라면 3으로 지정을 해줍니다.

    그 다음, 만든 시퀀스 오브젝트 model에 5개의 노드를 Dense레이어를 통해 연결해줍니다. 여기서 add를 통해 하나의 레이어를 추가해주는 것입니다.

     

    Dense 레이어는 입력과 출력을 모두 연결해주며 입력과 출력을 각각 연결해주는 가중치를 포함하고 있습니다. 입력이 3개 출력이 4개라면 가중치는 총 3X4인 12개가 존재하게 됩니다. Dense레이어는 머신러닝의 기본층으로 영상이나 서로 연속적으로 상관관계가 있는 데이터가 아니라면 Dense레이어를 통해 학습시킬 수 있는 데이터가 많다는 뜻이 됩니다.

     

    Dense의 첫번째 인자 : 출력 뉴런(노드)의 수를 결정

    Dense의 두번째 인자 : input_dim은 입력 뉴런(노드)의 수를 결정, 맨 처음 입력층에서만 사용

    Dense의 세번째 인자 : activation 활성화 함수를 선택

    • 활성화 함수 종류

     

      relu 은닉 층으로 학습
    'relu' 는 은닉층으로 역전파를 통해 좋은 성능이 나오기 때문에 마지막 층이 아니고서야 거의 relu 를 이용한다.
      sigmond yes or no 와 같은 이진 분류 문제
      softmax 확률 값을 이용해 다양한 클래스를 분류하기 위한 문데

     

    model.add(Dense(3))

     

    두번째 레이어의 노드의 갯수는 3개

     

     

    model.add(Dense(1))

     

    마지막 레이어의 노드의 갯수는 출력 데이터 y의 갯수와 동일하게 1개로 지정

     

    이렇게 만들어진 시퀀스 모델의 모양은 대략 이렇습니다.

    총 4개의 레이어 생성. 입력 출력 레이어 1개 히든레이어 2개

     

     

     

     

    model.compile(loss='mse', optimizer='adam')

     

    이제 만들어진 모델을 컴파일 합니다.

    여기서 들어간 인자값 loss, optimizer는 무엇이냐 하면,

    loss는 손실함수를 의미합니다. 얼마나 입력데이터가 출력데이터와 일치하는지 평가해주는 함수를 의미합니다. 여기서는 손실함수를 'mse'를 사용하겠다는 의미가 됩니다. mse는 평균제곱오차(mean squared error)를 의미합니다. 나중에 자세히 다룰 내용이고 여기서는 그냥 얼마나 예측과 다른지 평가해주는 값이라고 생각하시면 됩니다. 예측값과의 차이를 의미하므로 작으면 작을수록 좋은 모델이라는 의미가 됩니다.

    손실함수 옵션 더 알아보기 -> https://keras.io/losses/

     

    optimizer손실 함수를 기반으로 네트워크가 어떻게 업데이트될지 결정합니다. 여기서는 adam을 사용하였습니다.

    옵티마이저 종류 더 알아보기 -> https://keras.io/ko/optimizers/

     

     

    model.fit(x, y, epochs=100, batch_size=1)

     

    이제 컴파일한 모델을 드디어 훈련을 시킵니다. 입력데이터와 출력데이터를 인자로 넣고, epochs = 100, 100번 훈련을 시킨다는 의미입니다. batch_size는 작업단위를 의미합니다. 머신은 1차 함수를 100번 그린 것 중 1개씩 잡아서 작업을 합니다. 배치 사이즈는 몇 문항을 풀고 해답을 맞추는지 의미하기도 합니다. 여기서 그린 1차함수 100개 중 예측값과 거리를 이용해 오차값 즉, 손실함수(여기서는 mse)를 구하게 되는 것입니다.

    배치사이즈의 디폴트 값은 32 입니다. 명시를 해주지 않으면 머신은 32개씩 잡아서 훈련을 합니다.

     

     

    mse = model.evaluate(x, y, batch_size=1)

     

    배치사이즈를 1로 잡아 손실 함수를 계산합니다. 

     

     

    print('mse : ', mse)

     

    mse : 0.0758705266751349

     

    결과가 출력된 모습입니다. 데이터를 돌릴때마다 값이 다르게 나오고, 여기서 mse값을 더 좋게 만드는 것이 사람이 해주는 일입니다. 이것을 하이퍼파라미터 튜닝이라고 하는데, 결국엔 하이퍼파라미터 튜닝을 통해 적은 손실함수를 얻고 높은 예측률을 얻도록 해야하는 것이 인공지능 개발입니다. 하이퍼파라미터 튜닝에 대해서는 다음 장에서 더 설명하도록 하겠습니다.

    댓글

Designed by Tistory.