딥러닝(텐서플로우)

Keras 를 이용한 딥러닝 구현법 간단 설명(분류, FNN기준)

Dean83 2023. 3. 28. 15:50

tensorflow 를 사용할 수 있다는 기준으로 간략하게 내용 정리를 한다. 
분류 기준인 FNN을 기준으로 설명한다.

AI의 대략적 구성을 보자면, 신경망을 만들고 , 준비시키고, 학습시킨다. 
학습 과정을 보자면, 경사하강법 이라는 기법을 통해 학습을 진행한다. 

뒤에 이어 해당 방법이 무엇인지 설명하겠다.

 

1. 신경망 모델
    - keras.Sequential 함수를 이용해 신경망 모델을 만든다. 


1.1. keras.Sequential 
       - 배열형태의 인자값을 받는다. 
       - keras.layers.Dense(숫자) 혹은 keras.layers.Dense(숫자,activation='인자값') 형태를 조합하여 구성한다. 
       - Dense를 이용한 신경망 조합은. 입력 - 연산 - 출력 보통 이렇게 구성이 된다. 

1.2. keras.layers.Dense
       - 숫자는 퍼셉트론(뉴런 신경망 같은) 개수를 의미한다.
       - 입력, 출력 신경망 개수는 작다. (3개 정도?)
       - 인자값으로 숫자 외에 activation 이라는 활성화 함수 명을 인자값으로 받는다. 

          * 퍼셉트론은 신경망 개수 이다.
          * 퍼셉트론 개수 또한 여러번 돌려서 찾는 매직넘버 성격이 강하다.

1.3. activation 함수들
       - relu : 선형 함수의 하나. 신경망의 은닉층 에서 많이 사용한다.  양수는 양수 그대로, 음수는 0으로 반환하다보니, 
                   기존에 자주 쓰이던 시그모이드 함수의 기울기 소실이 없다고 한다. 또한 속도가 매우 빠르다고 한다.

      - softmax : 주로 출력층에 많이 사용된다. (시그모이드 함수도). 다중 분류에서 주로 사용된다.
                        각 분류별 확률 계산을 하고, 해당 확률의 총합이 1이므로, 어느 분류에 속할 확률이 높은지 인지할 수
                        있다.

      - sigmoid : 주로 출력층에 사용되며, 이진 분류에서만 사용된다.  (0과 1 사이)
                        0과 1사이의 값만 출력되기 때문에, 아무리 큰값이 들어와도 0에 수렴하는 경우가 발생 할 수 있고
                        이를 기울기 소실 이라고 한다.  

        * 은닉층 : 입력층, 출력층 사이에 있는 모든 신경망은 은닉층이라고 한다. 연산에 사용되는 층.

 

keras.Sequential([
    keras.layers.Dense(입력층 개수),
    keras.layers.Dense(은닉층 개수, activation="relu"),
    keras.layers.Dense(출력층 개수, activation='softmax')
])



2. 신경망 컴파일
     - keras.Sequential.compile 함수 호출을 통해, 인자값으로 받은 신경망들을 사용 준비 상태로 컴파일을 한다.
     - GPU가 있다면 GPU를 이용하고 그렇지 않으면 CPU를 이용한다. 

compile 함수의 인자값을 살펴보면, 

2.1. optimizer
        - 경사하강법을 어떤 방법으로 사용할지 정하는 인자값이다. 
        - 여기에 사용되는 알고리즘에 따라 최적값을 찾아가는 속도가 많이 달라진다.
       - adam이 가장 많이 사용된다. 
          
2.1.1. GD
           - 데이터의 모든값에서 기울기를 계산해서 최적값을 찾는 기초방식

2.1.2. SGD
          - 데이터의 일부를 추출하여 기울기를 계산해서 최적값을 찾는 방식

2.1.3. NAG
           - 관성을 부여해서, 먼저 이동을 한 후 거리를 계산

2.1.4. Momentum
           - 기울기를 따라서 이동할 때 관성을 부여한다. 기울기가 높으면 더 멀리 간다.

2.1.5. Adagrad
           - 가보지 않은곳은 많이 이동하고, 가본곳은 조금 이동하면서 세밀하게 살펴본다.

2.1.6. AdaDelta
          - Adagrad를 보완한것으로, 가본곳을 세세하게 살필때 정지하는 현상을 방지한다.

2.1.7. RMSProp
          - 가본곳을 천천히 이동하되, 이전 상황을 고려해서 수준을 결정한다.

2.1.9. Adam
          - Momentum과 RMSProp의 장점을 합친것으로 관성과 가본곳을 천천히 이동한다.

adamOptimizer = keras.optimizer.Adam(learning_rate=숫자값)
keras.Sequential(..).compile(optimizer = adamOptimizer ...)

2.2. metrics
       - 배열 인자값을 받는다. 
       - 어떤 인자값을 기준으로 인공지능 성능을 평가할 것인가? 라는 인자값이다.
       - accuracy 는 정확도 기준으로 평가한다는 의미이다

2.3. loss 
        - 인공지능의 학습 방향을 결정하는 변수값이다. 
       - sparse_categorical_crossentropy는 분류인공지능에 잘 동작한다고 한다.
          어떤 카테고리 분류를 잘 했는지 안했는지 구분을 해준다고 한다. 

        - 학습데이터가 원핫벡터의 경우 categorical_crossentropy를 사용하고,
          int 형태는 sparse_categorical_crossentropy를 사용한다

2.3.1. MeanSquredError (mse)
          - 예측값과 실제값 차이를 제곱하여 평균화 함.
          - 예측값과 실제값 차이의 면적을 구하며, 특이값이 존재하면 수치가 많이 늘어난다.

2.3.2. RMSE
           - MSE의 값 왜곡을 줄이기 위해 루트를 덮어 씌운것

2.3.3. BinaryCrossentropy
           - label이 2개일 경우 (0과 1) 사용하면 좋다고 한다. 

2.3.4. mean_absolute_error (mae)
           - 실제값과 예측값의 차이를 절대값으로 변환하여 평균화를 한다.
           - 에러값의 크기를 그대로 반영한다.

* 원핫벡터
    - 벡터의 값중 한개만 1이고, 나머지는 0인 벡터로, 단어 등 다른 데이터 형식을 벡터화 할때
       사용된다.

(예 : 1개의 문장에 4개의 단어가 들어가 있을 경우, "나는 등교시 운전을 한다" 에서, 나는, {1,0,0,0} 등교시, {0.1.0.0} ..

        로 정했다면, 해당 문장은 {[1,0,0,0],   로 데이터화 하여 표현할 수 있다.

                                                  [0,1,0,0],
                                                  [0,0,1,0],

                                                  [0,0,0,1]})
           

 

신경망모델변수명(keras.Sequential 함수).compile(optimizer="adam", metrics=["accuracy"],
              								loss="sparse_categorical_crossentropy")

3. keras.Sequential.fit
    - compile 이후 신경망 학습하는 함수 이다. 

인자값을 살펴보면, 

 

3.1 epochs
    - 몇번 학습을 수행 할지 정해주는 int 값이다. 많이 학습한다고 해서 좋은게 아니고, 적절한 값을 찾아야만 한다. 

3.2. x, y
       - 학습에 사용될 실제 데이터 이다. 

 

3.3. validation_data
        - 학습의 정답이 담긴 데이터 이다. x, y 와 같은 형태의 데이터 이어야 한다. AI가 학습 진행을 하고 정확도 계산 혹은
          early end를 결정하기 위해선 정답이 필요하다. 

 

3.4. callbacks
       - 배열 인자값, 
       - keras.callbacks 에 명시된 함수를 인자값으로 받는다. 보통 조기종료후 실행되는 콜백. early stop을 인자값으로
         준다. 

 

model.fit(학습x값, 학습y값, epochs=EPOCHS,
                    validation_data=(정답x값, 정답y값),
                    callbacks=[콜백변수 - keras.callbacks 함수로, EarlyStopping])



4. keras.callbacks.EarlyStopping
     인자값을 보면, 
     4.1. monitor
             - 기준이 되는 값을 의미. 
            - val_loss 는 val_loss 가 더이상 감소되지 않을경우 해당. 
            - val_acc 의 경우, 정확도를 의미함. 

     4.2. patience
            - 더이상 학습의 개선이 없을 경우에도, 최적값으로 몇번 더 검증을 할것인가 하는 인자값.
             - 숫자값

    4.3. min_delta
           - 개선이 되었는지 아닌지 평가하는 기준값. 만일 값이 0.1인데, 다음 step에 개선된 값이 0.05라면 개선이 안된것
              으로 간주한다. 

    4.4. verbose
            - 0 또는 1의 값
            - 1일경우, early stopping 발생시 화면에 알려줌. 

    4.5. mode
           - auto, min, max
           - monitor 값이 최대이어야 하는지, 최소이어야 하는지 혹은 자동판단인지 설정.
           - val_loss 는 최소, val_acc는 최대가 유리.
  
    4.6. baseline
            - 학습이 달성해야 하는 최소한의 기준값. 
            - pacience 이내에 baseline 보다 개선이 되지 않는다면 트레이닝을 중단함. 

    4.7. restore_best_weights
            - true, false
            - true일 경우, 학습 종료 후 weight를 학습 시 가장 좋았던 값으로 복원하고, false는 가장 마지막 값으로 설정

 

early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)

 

 

'딥러닝(텐서플로우)' 카테고리의 다른 글

Predict  (0) 2023.03.31
이미지 (영상) 딥러닝 CNN  (0) 2023.03.30
경사하강법  (0) 2023.03.28
딥러닝 개요  (0) 2023.03.23
신경망 종류  (0) 2023.03.23