Open njs03332 opened 1 year ago
keras.layers.Dense(100, activation="elu", kernel_initializer="he_normal", kernel_constraint=keras.constrains.max_norm(1.))
## 11.5 요약 및 실용적인 가이드라인
- 11장에서 다룬 여러 기법을 언제 쓰면 좋을지에 대한 명확한 기준은 없지만, 대부분의 경우에 잘 맞는 설정을 정리
- 기본 DNN 설정
| 하이퍼파라미터 | 기본값 |
|---|---|
| 커널 초기화 | He 초기화 |
| 활성화 함수 | ELU |
| 정규화 | 얕은 신경일 경우 없음. 깊은 신경망이라면 배치 정규화 |
| 규제 | 조기 종료 (필요시 L2규제 추가) |
| 옵티마이저 | 모멘텀 최적화 (또는 RMSProp 이나 Nadam) |
| 학습률 스케줄 | 1 사이클 |
- 자기 정규화를 위한 DNN 설정 : 네트워크가 완전 연결 층을 쌓은 단순한 모델이라면 자기 정규화를 사용할 수 있음
| 하이퍼파라미터 | 기본값 |
|---|---|
| 커널 초기화 | 르쿤 초기화 |
| 활성화 함수 | SELU |
| 정규화 | 없음 (자기 정규화) |
| 규제 | 필요하다면 알파 드롭아웃 |
| 옵티마이저 | 모멘텀 최적화 (또는 RMSProp 이나 Nadam) |
| 학습률 스케줄 | 1 사이클 |
- 비슷한 문제를 해결한 모델을 찾을 수 있다면 사전 훈련된 신경망의 일부를 재사용해볼 것
- 레이블이 없는 데이터가 많다면 비지도 사전훈련을 사용
- 비슷한 작업을 위한 레이블된 데이터가 많다면 보조 작업에서 사전 훈련을 수행
### 예외 (p.459 상단)
- 희소 모델이 필요하다면 L1규제 사용. 매우 희소한 모델이 필요하면 텐서플로 모델 최적화 툴킷 사용 (기본 DNN 설정 사용)
- 빠른 응답을 하는 모델이 필요하다면 층 개수를 줄이고 배치 정규화 층을 이전 층에 합치기. LeakyReLU나 ReLU 같은 빠른 활성화 함수 사용
- 위험에 민감하고 예측 속도가 매우 중요하지 않은 애플리케이션이라면 MC 드롭아웃 사용
# 앞서 훈련한 드롭아웃 모델을 재훈련하지 않고 성능을 향상시키는 완전한 MC 드롭아웃 구현
y_probaas = np.stack([model(X_test_scaled, training=True)
for sample in range(100)])
y_proba = y_probas.mean(axis=0)
# 드롭아웃을 끄고 패션 MNIST 테스트 세트 첫 번째 샘플 모델 예측 확인
np.round(model.predict(X_test_scaled[:1]), 2)
## 결과: 99%로 이 이미지가 클래스 9(앵클 부츠)에 속한다고 확신
# 드롭아웃을 활성화하여 예측
np.round(y_probas[:, :1], 2)
## 결과: 여전히 클래스 9를 선호하지만 이따금 클래스 5(샌들)이나 7(스니커즈)로 생각 (모두 신발이라는 공통점)
# 첫 번째 차원으로 평균 내기
np.round(y_proba[:1], 2)
## 결과: 여전히 클래스 9에 속한다고 생각하나 62%만 확신함. 모델이 생각하는 다른 클래스에 대해 정확히 알 수 있음
# 확률 추정의 표준 분포 확인
y_std = y_probas.std(axis=0)
np.round(y_std[:1], 2)
## 결과: 이 추정에는 많은 분산이 있음 - 만약 위험에 민감한 시스템 (ex. 의료, 금융) 이런 불확실한 예측을 주의 깊게 다루어야 함
# 정확도 확인
accuracy = np.sum(y_pred == y_test) / len(y_test)
accuracy
## 결과: 조금 향상됨
몬테 카를로 샘플의 숫자 (여기서는 100) 는 튜닝할 수 있는 하이퍼파라미터
모델이 훈련하는 동안 다르게 작동하는 층을 가지고 있다면 Dropout 층을 아래와 같은 MCDropout 클래스로 바꿔주어야 함
class MCDropout(keras.layers.Dropout):
def call(self, inputs):
return super().call(inputs, training=True)
Dropout 층을 상속하고 call() 메서드를 오버라이드하여 training 매개변수를 True로 강제로 설정