ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [HandsOn]10. 케라스를 사용한 인공 신경망 - 내용 정리2
    [도서완독]Hands On Machine Learning 2022. 7. 1. 17:16

    10.2 케라스로 다층 퍼셉트론 구현하기 

    10.2.2 시퀀셜 API를 사용하여 이미지 분류기 만들기

    • 케라스를 사용하여 패션 MNIST 적재

    픽셀 강도가 정수(0~255)로 되어 있음 

    경사 하강법으로 신경망 훈련하기 때문에 입력 특성의 스케일을 조정해야 함 <-왜?

     

    model=keras.models.Sequential()
    model.add(keras.layers.Flatten(input_shape=[28,28]))
    model.add(keras.layers.Dense(300,activation="relu"))
    model.add(keras.layers.Dense(100,activation="relu"))
    model.add(keras.layers.Dense(10,activation="softmax"))

    모델 summary

     

    -각 층의 이름: 정하지 않으면 자동으로 생성

    -출력 크기: None은 배치 크기에 어떤 값도 가능하다는 의미

    파라미터 개수

    Dense 충은 많은 파라미터를 가지는데, 훈련 데이터를 학습하기 충분한 유연성 but 과대적합의 위험

     

    층의 모든 파라미터는 get_weights() 메서드와 set_weights()메서드를 사용해 접근 가능 

     

    모델 컴파일

    모델을 만들고 나서 compile() 메서드를 호출하여 손실 함수와 옵티마이저를 지정해야 함.

    model.compile(loss="sparse_categorical_crossentropy",
                  optimizer="sgd",
                  metrics=["accuracy"])

    레이블이 정수 하나고, 클래스가 배타적이므로 "sparse_categorical_crossentropy" 손실 

    레이블이 원 핫 벡터라면, "categorical_crossentropy"

    이진 분류라면 출력층에 "sigmoid", 손실로는 "binary_crossentropy"

     

    모델 훈련과 평가 

    훈련 세트의 클래스가 편중되어 있다면 class_weight 매개변수 지정

    - 적게 등장하는 클래스는 높은 가중치 부여, 많이 등장하는 클래스는 낮은 가중치 부여 

     

    샘플별로 가중치를 부여하고 싶다면 sample_weight 매개변수 지정 

     

    fit() 메서드가 반환하는 History 객체에는 훈련 파라미터(history.params), 수행된 에포크 리스트(history.epoch)가 포함.
    이 객체에는 에포크가 끝날 때마다의 훈련 세트와 검증 세트에 대한 손실과 지표를 담은 history.history(딕셔너리)가 있음. 

     

    이 딕셔너리를 사용해 판다스 데이터프레임을 만들고 plot() 메서드를 호출하면 learning curve를 볼 수 있음

     

    훈련하는 동안 훈련 정확도와 검증 정확도가 꾸준히 상승, 

    훈련 손실과 검증 손실은 감소

    검증 곡선이 훈련 곡선과 가까움 (크게 과대적합 되지 않았다는 증거)

     

    • 훈련 손실은 에포크 진행 중 계산, 검증 손실은 에포크가 끝난 후에 계산
    • 따라서 훈련 곡선을 볼때 왼쪽으로 에포크의 절반만큼 옆으로 이동해서 생각!

    검증 손실이 여전히 감소한다면 모델이 완전히 수렴되지 않은 것. fit() 메서드를 다시 호출하면 중지되었던 곳에서부터 훈련을 이어나갈 수 있음 

     

    모델 성능이 만족스럽지 않으면?

    처음으로 되돌아가서 하이퍼파라미터를 튜닝!

     

    학습률을 가장 먼저 확인 

    도움이 안된다면, 다른 옵티마이저를 테스트

    (다른 하이퍼파라미터를 바꾼 후에는 다시 학습률을 튜닝)

    여전히 별로면, 층 개수, 층에 있는 뉴런 개수, 은닉층이 사용하는 활성화 함수 등을 튜닝 

    배치 크기 등...

     

    검증 정확도가 만족스럽다면?

    evaluate 메서드는 batch_size와 sample_weight 같은 다른 매개변수도 지원

     

    모델을 사용해 예측을 만들기 

    X_new=X_test[:3]
    y_proba=model.predict(X_new)
    #y_pred=model.predict_classes(X_new)
    y_proba.round(2)
    np.argmax(y_proba[0])
    np.argmax(y_proba[1])
    np.argmax(y_proba[2])

    잘.. 됨...

     

    10.2.3 시퀀셜 API를 사용하여 회귀용 다층 퍼셉트론 만들기

    이미지 분류기와 거의 비슷하므로 차이점만 짚고 넘어가겠음.

     

    출력층이 활성화 함수가 없는 하나의 뉴런. 

    손실 함수-> MSE

    데이터에 잡음이 많기 때문에 과대적합을 막는 용도로 뉴런 수가 적은 은닉층 하나만 사용했다고 함.

     

     

    여튼 시퀀셜 API는 매우 쉽당. 하지만 입력,출력이 여러 개거나 더 복잡한 신경망을 만들어야 할 때, 함수형(functional API)를 사용한다! 그건 다음 포스팅에서! 

     

     

Designed by Tistory.