Rank 1 rank accuracy test preds labels Augmentation python Fine grained Classification Accuracy precision rank1 rank5 flowers 17

rank-1 및 rank-5 정확도는 간단한 유틸리티 함수를 구축하여 계산할 수 있습니다. 모듈 내에서 rank.py라는 파일을 추가하여 이 기능을 utils 하위 모듈에 추가합니다.

rank.py를 열고 rank5_accuracy 함수를 정의합니다.

4 행은 rank5_accuracy 함수를 정의합니다. 이 방법은 다음 두 가지 매개 변수를 받습니다.

• preds : N × T 행렬, 행 수 N은 각 클래스 레이블 T와 관련된 확률을 포함합니다.

• labels : 데이터 세트의 이미지에 대한 정답 레이블.

그런 다음 6 행과 7 행에서 각각 rank-1 및 rank-5 정확도를 초기화합니다. 계속해서 rank-1 및 rank-5 정확도를 계산해 보겠습니다.

10 행에서 데이터 세트의 각 예에 대한 예측 및 정답 클래스 레이블을 반복하기 시작합니다. 14 행은 예측 확률 p를 내림차순으로 정렬하여 가장 큰 확률의 인덱스가 목록의 맨 앞에 배치되도록합니다. 정답 레이블이 상위 5 개 예측에 존재하는 경우 rank-5 변수를 증가시킵니다 (18 행 및 19 행). 정답 레이블이 1 위 위치와 같으면 rank-1 변수를 증가시킵니다 (22 행 및 23 행).

마지막 코드 블록은 총 레이블 수로 나누어 rank-1과 rank-5를 백분율로 변환합니다.

30 행은 rank-1 및 rank-5 정확도의 2-튜플을 호출 함수에 반환합니다.

데이터 세트의 rank-1 및 rank-5 정확도를 계산하는 방법을 보여주기 위해 23 장으로 돌아가서 ImageNet 데이터 세트에서 사전 훈련 된 컨볼루션 신경망을 특징 추출기로 사용했습니다. 이러한 추출 된 기능을 기반으로 데이터에 대한 로지스틱 회귀 분류기를 훈련하고 모델을 평가했습니다. 이제 정확도 보고서를 확장하여 rank-5 정확도도 포함합니다.

로지스틱 회귀 모델에 대한 rank-1 및 rank-5 정확도를 계산하는 방식은 모든 머신 러닝, 신경망 또는 딥 러닝 모델에 대해 rank-1 및 rank-5 정확도를 계산할 수 있습니다. 딥러닝 커뮤니티 외부에서 이 두 가지 측정 항목을 모두 실행합니다. 말한대로 새 파일을 열고 이름을 rank_accuracy.py로 지정한 후 다음 코드를 삽입하십시오.

2 ~ 5 행은 필수 Python 패키지를 가져옵니다. 새로 정의 된 rank5_accuracy 함수를 사용하여 각각 예측의 rank-1 및 rank-5 정확도를 계산합니다. pickle 패키지는 디스크에서 사전 훈련 된 scikit-learn 분류기를로드하는 데 사용됩니다. 마지막으로 h5py는 23 장의 CNN에서 추출한 기능의 HDF5 데이터베이스와 인터페이스하는 데 사용됩니다. 다음 단계는 명령 줄 인수를 구문 분석하는 것입니다

스크립트에는 추출 된 피처의 HDF5 데이터베이스에 대한 경로 인 –db, 사전 훈련 된 로지스틱 회귀 분류기의 경로 인 –model 이 필요합니다. 다음 코드 블록은 데이터의 75 %가 학습에 사용되고 25 %가 테스트에 사용되었다고 가정 할 때 디스크에서 사전 학습 된 모델을 로드하고 HDF5 데이터 세트로 분할 된 학습 및 테스트의 인덱스를 결정합니다.

마지막으로 rank-1 및 rank-5 정확도를 계산해 보겠습니다

28 행은 테스트 세트의 모든 데이터 포인트에 대한 각 클래스 레이블의 확률을 계산합니다. 예측 된 확률과 테스트 데이터의 정답 레이블을 기반으로 29 행의 순위 정확도를 계산할 수 있습니다.

32 행과 33 행은 각각 rank-1과 rank-5를 터미널에 표시합니다. CNN에서 피처을 추출한 다음 피처 위에 scikit-learn 모델을 훈련시킨 23 장의 모든 예제에서 작동하도록 이 예제를 코딩했습니다.

Flowers-17 데이터 세트에 대한 rank-1 및 rank-5 정확도를 계산해 보겠습니다.

Flowers-17 데이터 세트에서 VGG16 아키텍처에서 추출 된 기능에 대해 훈련 된 로지스틱 회귀 분류기를 사용하여 92.06 % rank-1 정확도를 얻습니다. rank-5 정확도를 살펴보면 분류 기가 거의 완벽하여 99.41 %의 rank-5 정확도를 얻었습니다.

24.1.4 CALTECH-101 Rank 정확도

더 큰 CALTECH-101 데이터 세트에 대한 또 다른 예를 시도해 보겠습니다.

여기서 우리는 95.58 % rank-1 정확도와 99.45 % rank-5 정확도를 얻었으며, 이는 60 % 분류 정확도를 깨기 위해 고군분투했던 이전 컴퓨터 비전 및 머신 러닝 기술보다 크게 향상되었습니다.

24.2 요약

이 장에서는 rank-1 및 rank-5 정확도의 개념을 검토했습니다. rank-1 정확도는 우리의 실측 레이블이 가장 큰 확률로 클래스 레이블과 동일한 횟수입니다. rank-5 정확도는 rank-1 정확도에서 확장되어 좀 더 “관대 한” 순위 입니다. 여기서 우리는 ground-truth 레이블이 가장 큰 확률 상위 5 개 예측 클래스 레이블에 나타나는 횟수에 따라 rank-5 정확도를 계산합니다.

일반적으로 사람 조차도 이미지에 올바르게 레이블을 지정하기 어려운 ImageNet과 같은 크고 까다로운 데이터 세트에 대해 rank-5 정확도를 보고합니다. 이 경우 rank-5 개 예측에 정답 라벨이 단순히 존재하는 경우 모델에 대한 예측이 ‘올바른’ 것으로 간주합니다.

8 장에서 논의했듯이, 진정으로 잘 일반화되는 네트워크는 rank-5 확률에서 상황에 맞는 유사한 예측을 생성합니다.

마지막으로, rank-1 및 rank-5 정확도는 딥러닝 및 이미지 분류에만 국한되지 않습니다. 다른 분류 작업에서도 이러한 메트릭을 볼 수 있습니다.

HDF5 LargeSize Data 딥러닝 인공지능 파이썬 python dataset

https://kdderas.io/

Rank 정확도 이해#인공지능 #딥러닝 #기계학습 AI DeepLearning #MachineLearning Augmentation 파이썬 python Fine Grained Classification Accuracy Precision rank1 rank5 flower17 caltech101

고급 딥 러닝 주제 (예 : 전이 학습)에 대한 논의가 너무 깊어지기 전에 먼저 한 발 뒤로 물러나서 rank 1, rank -5 및 rank -N 정확도의 개념에 대해 논의하겠습니다. 특히 컴퓨터 비전과 이미지 분류 공간에서 딥 러닝 문헌을 읽을 때 rank 정확도라는 개념을 접하게 될 것입니다. 예를 들어 ImageNet 데이터 세트에서 평가 된 기계 학습 방법을 제시하는 거의 모든 논문은 rank 1 및 rank 5 정확도 측면에서 결과를 제시합니다 (rank-1 및 rank-5 정확도가 보고되는 이유를 알아볼 것입니다).

rank 1 및 rank 5 정확도는 정확히 무엇입니까? 그리고 기존의 정확도 (즉, 정밀도)와 어떻게 다른가요? 이 장에서는 rank 정확도에 대해 논의하고 이를 구현하는 방법을 학습 한 다음 Flowers-17 및 CALTECH-101 데이터 세트에서 훈련 된 기계 학습 모델에 적용합니다.

24.1 Rank 정확도

왼쪽 : 신경망이 분류하려고하는 개구리의 입력 이미지. 오른쪽 : 자동차의 입력 이미

왼쪽 : 신경망이 분류하려고하는 개구리의 입력 이미지. 오른쪽 : 자동차의 입력 이미지.

순위 정확도는 예를 통해 가장 잘 설명됩니다. 비행기, 자동차, 새, 고양이, 사슴, 개, 개구리, 말, 배, 트럭의 10 개 클래스를 포함하는 CIFAR-10 데이터 세트에서 훈련 된 신경망을 평가한다고 가정 해 보겠습니다.

다음 입력 이미지 (위 그림 왼쪽)가 주어지면 신경망에 각 클래스 레이블에 대한 확률을 계산하도록 요청합니다. 그러면 신경망은 아래 표 (왼쪽)에 나열된 클래스 레이블 확률을 반환합니다.

왼쪽 : 그림 (왼쪽)에 대해 신경망이 반환 한 클래스 레이블 확률.
오른쪽 : 그림 (오른쪽)에 대해 네트워크에서 반환 한 클래스 레이블 확률.

왼쪽 : 그림 (왼쪽)에 대해 신경망이 반환 한 클래스 레이블 확률.

오른쪽 : 그림 (오른쪽)에 대해 네트워크에서 반환 한 클래스 레이블 확률.

확률이 가장 큰 클래스 레이블은 실제로 정확한 예측 인 frog (97.3 %)입니다. 이 과정을 반복한다면 :

1. 단계 # 1 : 데이터 셋의 각 입력 이미지에 대한 클래스 레이블 확률 계산.

2. 단계 # 2 : 실측 레이블이 확률이 가장 큰 예측 클래스 레이블과 같은지 확인합니다.

3. 단계 # 3 : 단계 # 2가 참인 횟수 집계.

우리는 rank-1 정확도에 도달 할 것입니다. 따라서 rank-1 정확도는 최상위 예측이 실측 레이블과 일치하는 예측의 백분율입니다. 이것은 우리가 계산하는 데 사용되는 “표준”유형의 정확도입니다. 올바른 예측의 총 수를 데이터 세트의 데이터 포인트 수로 나눕니다.

다음 이 개념을 rank-5 정확도로 확장 할 수 있습니다. 1위 예측에만 신경을 쓰지 않고 상위 5 개 예측에 신경을 씁니다. 평가 프로세스는 다음과 같습니다.

1. 1 단계 : 데이터 세트의 각 입력 이미지에 대한 클래스 레이블 확률을 계산합니다.

2. 2 단계 : 예측 된 클래스 레이블 확률을 내림차순으로 정렬하여 확률이 더 높은 레이블이 목록의 맨 앞에 배치되도록합니다.

3. 3 단계 : 2 단계의 상위 5 개 예측 레이블에 실측 레이블이 있는지 확인합니다.

4. 4 단계 : 단계 # 3이 참인 횟수를 계산합니다.

rank-5는 단순히 rank-1 정확도의 확장입니다. 분류기의 # 1 예측 만 고려하는 대신 네트워크의 상위 5 개 예측을 고려합니다. 예를 들어 임의의 신경망을 기반으로 CIFAR-10 범주로 분류 할 입력 이미지를 다시 고려해 보겠습니다 ( 위 그림 오른쪽). 네트워크를 통과 한 후 표 (오른쪽)에 자세히 설명 된 클래스 레이블 확률을 얻습니다. 우리의 이미지는 분명히 자동차입니다. 그러나 우리 네트워크는 트럭을 최상위 예측으로 보고했습니다. 이것은 1 순위 정확도에 대한 잘못된 예측으로 간주됩니다. 그러나 네트워크의 상위 5 개 예측을 살펴보면 자동차가 실제로 2 위 예측이라는 것을 알 수 있으며 이는 5 위 정확도를 계산할 때 정확합니다. 이 접근 방식은 임의의 랭크 N 정확도로 쉽게 확장 될 수 있습니다. 그러나 우리는 일반적으로 rank-1 및 rank-5 정확도 만 계산합니다.

질문을 하나 해보겠습니다. 왜 rank-5 정확도를 계산해야 할까요?

CIFAR-10 데이터 세트의 경우 rank-5 정확도를 계산하는 것은 약간 어리석은 일이지만 크고 어려운 데이터 세트, 특히 세분화 된 분류의 경우 특정 CNN에서 상위 5 개 예측을 보는 것이 도움이 되는 경우가 많습니다. 아마도 우리가 rank-1과 rank-5 정확도를 계산하는 이유에 대한 가장 좋은 예는 에는 시베리안 허스키, 오른쪽에는 에스키모 개가(아래 그림) 있는 Szegedy et al 논문 입니다. 대부분의 인간은 두 동물의 차이를 인식하지 못할 것입니다. 그러나 이 두 클래스는 ImageNet 데이터 세트에서 유효한 레이블입니다.

왼쪽 : 시베리안 허스키. 오른쪽 : 에스키모 개.

HDF5 LargeSize Data 딥러닝 인공지능 파이썬 python dataset

https://kdderas.io/

유사한 특성을 가진 많은 클래스 레이블을 포함하는 대규모 데이터 세트로 작업 할 때 네트워크 성능을 확인하기 위해 rank-1 정확도에 대한 확장으로 rank-5 정확도를 종종 검사합니다. 이상적인 세계에서 rank-1 정확도는 rank-5 정확도와 동일한 비율로 증가하지만 까다로운 데이터 세트에서는 항상 그런 것은 아닙니다.

따라서 우리는 네트워크가 이후 epoch에서 여전히 “학습 중”인지 확인하기 위해 rank-5 정확도도 조사합니다. rank-1 정확도가 훈련이 끝날 무렵 정체 되는 경우 일 수 있지만, 네트워크가 더 많은 차별적 기능을 학습함에 따라 rank-5 정확도가 계속 향상됩니다 (그러나 rank-1 예측을 추월 할만큼 차별적이지는 않음). 마지막으로 이미지 분류 문제 (ImageNet은 표준 예임)에 따라 rank-1 및 rank-5 정확도를 함께 보고해야합니다.

fineTuning 파인튜닝 AI CONV 필터Augmentation python Keras Classification Fine Tuning Flowers17

이제 처음부터 끝까지 파인튜닝을 적용 할 때입니다. 새 파일을 열고 이름을 finetune_flowers17.py로 지정하고 다음 코드를 삽입합니다.

python deep learing

2 ~ 18 행은 Python 패키지를 가져와야 합니다. 이전 예제에서 본 적이있는 더 많은 패키지 (대부분 우리가 이미 잘 알고 있음). 5-7 행은 데이터 세트 로드와 함께 이미지 전처리기를 가져옵니다. 8 행은 VGG16 (12 행)의 헤드를 대체하기 위해 새로 정의 된 FCHeadNet을 가져옵니다. 9 행에서 ImageDataGenerator 클래스를 가져 오면 데이터 세트에 데이터 증대를 적용 할 것임을 의미합니다.

10 행과 11 행은 네트워크가 실제로 입력 데이터에서 패턴을 학습하는 데 필요한 최적화 프로그램을 가져옵니다. 이미 SGD에 대해 잘 알고 있지만 RMSprop에 대해서는 아직 다루지 않았습니다. 27 장까지 고급 최적화 기술에 대한 논의를 하겠습니다.하지만 당분간은 RMSprop이 필요한 상황이 자주 사용된다는 것을 이해하고 있으면 됩니다. 이 방법은 합리적인 성능을 신속하게 얻을 수 있습니다 (FC 레이어 세트를 “워밍업”하는 경우).

13 행과 14 행은 Keras로 파인튜닝을 적용 할 때 필요한 두 가지 클래스 (입력 및 모델)를 가져옵니다. 네트워크 수술을 수행 할 때이 두 가지가 모두 필요합니다. 계속해서 명령 줄 인수를 구문 분석해 보겠습니다.

python deep learing

스크립트에 대해 두 개의 명령 줄 인수가 필요합니다. –dataset, Flowers-17 데이터 세트가 포함 된 입력 디렉토리 경로와 –model, 훈련 후 출력 직렬화 된 가중치 경로입니다. 네트워크를 훈련 할 때 데이터 증가를 수행하는 ImageDataGenerator를 초기화 할 수도 있습니다.

python deep learing

22 장에서 언급했듯이 거의 모든 경우에 데이터 증가는 정확도를 거의 떨어 뜨리지 않고 정확도를 높이고 과적 합을 방지하는 데 도움이 되기 때문에 데이터 증가를 적용해야 합니다. 딥 CNN을 처음부터 훈련시키기에 충분한 데이터가 없을 때 파인튜닝의 경우에도 마찬가지입니다. 다음 코드 블록은 파일 경로에서 classNames 구문 분석과 함께 디스크에서 imagePaths를 가져 오는 작업을 처리합니다.

python deep learing

다시, 입력 데이터 세트가 다음과 같은 디렉토리 구조를 갖는다고 가정합니다.

python deep learing

따라서 경로 구분자를 사용하여 파일 경로에서 클래스 레이블을 쉽고 편리하게 추출 할 수 있습니다. 이제 디스크에서 이미지 데이터 세트를 로드 할 준비가되었습니다.

python deep learing

41과 42 행은 이미지 전처리기를 초기화합니다. 모든 입력 이미지의 크기를 VGG16 네트워크에 필요한 입력 크기 인 224×224 픽셀 (이미지의 원래 가로 세로 비율 유지)로 조정합니다. 46과 47행은 이미지 전처리기를 적용하여 디스크에서 데이터와 레이블을 로드합니다. 다음으로 학습 및 테스트 분할 (학습용 데이터의 75 %, 테스트 용 25 %)을 만들고 레이블을 원-핫 인코딩합니다.

python deep learing

이제 재미있는 부분 입니다 – 네트워크 수술 수행 :

python deep learing

61 행과 62 행은 제공되고 사전 학습 된 ImageNet 가중치를 사용하여 디스크에서 VGG16 아키텍처를 로드합니다. VGG16의 헤드는 자체 FCHeadNet으로 교체 할 예정이므로 일부러 그대로 둡니다. 또한 input_tensor를 224x224x3 픽셀로 명시적으로 정의하려고 합니다. 그렇지 않으면 볼륨의 모양이 일치하지 않으므로 네트워크를 훈련하려고 할 때 오류가 발생합니다.

66 행은 baseModel 바디을 입력으로 사용하고, len(classNames)을 총 클래스 레이블 수 (Flowers-17의 경우 17 개)와 FC 계층의 256 개 노드로 사용하여 FCHeadNet을 인스턴스화합니다.

실제 “수술”은 입력으로 VGG16 (baseModel.input)의 바디을 사용하고 출력으로 headModel을 사용하여 새 모델을 구성하는 70 행에서 수행됩니다. 그러나 아직 네트워크를 훈련시킬 준비가되지 않았습니다. 이 장의 앞부분에서 역 전파 단계에서 업데이트되지 않도록 바디의 가중치를 고정해야 한다고 언급했습니다. baseModel의 모든 레이어에 대해 .trainable 매개 변수를 False로 설정하여 이 고정을 수행 할 수 있습니다.# loop over all layers in the base model and freeze them so they # will *not* be updated during the training process for layer in baseModel.layers: layer.trainable = False

이제 헤드를 바디에 연결하고 바디의 레이어를 고정 했으므로 네트워크의 새 헤드를 수정할 수 있습니다.

python deep learing
python deep learing

80 번 행은 27 장에서 자세히 설명 할 알고리즘 인 RMSprop 최적화 프로그램을 초기화합니다. FC 헤드를 워밍업하기 위해 작은 학습률 1e-3을 사용하는 방법에 주목하십시오. 파인튜닝을 적용 할 때 거의 항상 네트워크 학습에 사용 된 원래 학습률보다 몇 배는 아니더라도 1 배 이상 작은 학습률을 사용하게 됩니다.

88-91 행은 데이터 증가 방법을 사용하여 새로운 FC 헤드를 훈련합니다. 다시 말하지만, 각 이미지가 완전히 순전파되는 동안 그래디언트는 부분적으로만 역 전파됩니다. 역전파는 FC 레이어 후에 끝납니다. 여기서 우리의 목표는 헤드만 “수정”하고 네트워크 바디 가중치를 변경하지 않는 것입니다. 여기에서 워밍업 단계를 25 epoch 동안 훈련 할 수 있습니다. 일반적으로 데이터 세트에 따라 자체 FC 헤드가 10 ~ 30 epoch 동안만 워밍업 되도록 허용합니다.

준비 단계가 끝나면 테스트 세트에 대한 네트워크 성능을 평가하기 위해 일시 ​​중지합니다.

python deep learing

위의 코드를 사용하면 헤드를 예열하기 전과 후에 파인튜닝의 효과를 비교할 수 있습니다. 이제 FC 레이어가 부분적으로 학습되고 초기화되었으므로 바디의 일부 CONV 레이어를 고정 해제하고 학습 가능하게 만들어 보겠습니다.

python deep learing

바디의 주어진 레이어를 다시 학습 가능하게 만드는 것은 주어진 레이어에 대해 매개 변수 .trainable을 True로 설정하는 것입니다. 어떤 경우에는 바디 전체를 훈련 할 수 있도록하고 싶을 것입니다. 그러나 VGG와 같은 많은 매개 변수가 있는 깊은 아키텍처의 경우 상위 CONV 레이어만 고정 해제 한 다음 계속 훈련하는 것이 좋습니다. 분류 정확도가 계속 향상되면 (과적합없이) 신체에서 더 많은 레이어를 고정 해제하는 것을 고려할 수 있습니다.

이 시점에서 학습을 시작해야 하므로 SGD(낮은 학습률로 설정하고)로 전환하고 학습을 계속합니다.

python deep learing

이번에는 네트워크가 100 epoch 이상을 훈련하도록 허용하여 CONV 필터가 훈련 데이터의 기본 패턴에 적응할 수 있도록합니다. 마지막으로, 파인튜닝된 네트워크를 평가하고 가중치를 디스크에 직렬화 할 수 있습니다.

python deep learing

Flowers-17 데이터 세트에서 네트워크 수술을 수행하고 VGG16을 파인튜닝 하려면 다음 명령을 실행하십시오.

python deep learing
python deep learing

워밍업 단계에서 첫 번째 에포크 (≈ 36 %)에 대해 초기 정확도가 얼마나 낮은 지 확인하십시오. 이 결과는 새 헤드의 FC 레이어가 무작위로 초기화되고 이전에 훈련 된 CONV 필터에서 패턴을 학습하려고 시도하기 때문입니다. 그러나 정확도는 빠르게 상승합니다. 10 epoch 까지는 분류 정확도가 80 % 이상이고 25 epoch에는 거의 90 %의 정확도에 도달했습니다.

이제 FCHeadNet이 웜 스타트를 얻었으므로 SGD로 전환하고 바디의 첫 번째 CONV 레이어 세트를 고정 해제하여 네트워크가 또 다른 100 epoch 동안 훈련 할 수 있도록합니다. 정확도는 피처 추출을 사용하여 얻은 93 %보다 높은 95 %의 분류 정확도로 계속 향상됩니다.

python deep learing
python deep learing

보다 적극적인 데이터 증대를 수행하고 VGG16에서 점점 더 많은 CONV 블록을 계속해서 고정 해제하면 추가적인 정확도를 얻을 수 있습니다. 파인튜닝이 피처 추출보다 확실히 더 많은 작업이지만 CNN의 가중치를 특정 데이터 세트에 맞게 조정하고 수정할 수도 있습니다. 피처 추출은 허용하지 않습니다. 따라서 충분한 학습 데이터가 제공되면 간단한 특징 추출 만하는 것보다 더 높은 분류 정확도를 얻을 수 있으므로 파인튜닝을 적용하는 것이 좋습니다.

* 참고

InputLayer’ object has no attribute ‘outbound_nodes’ 에러가 나면 keras와 tensorflow간 호환 오류이다.

관련 import를 keras에서 tensorflow.keras. 로 모두 바꾸어야 한다. ubuntu에서는 에러가 없을 수 있음

python deep learing

이 장에서는 두 번째 유형의 전이 학습 인 파인튜닝에 대해 설명했습니다. 파인튜닝은 완전히 연결된 네트워크 헤드를 무작위로 초기화 된 새로운 헤드로 교체하여 작동합니다. 원래 네트워크의 바디에있는 레이어는 새 FC 레이어를 훈련하는 동안 고정됩니다.

네트워크가 합리적인 정확도를 얻기 시작하면 FC 계층이 (1) 기본 훈련 데이터와 (2) 네트워크에서 이전에 훈련 된 CONV 필터 모두에서 패턴을 학습하기 시작했음을 암시하면 부분 고정을 해제합니다 (모두는 아님). 바디의 – 훈련은 계속 될 수 있습니다.

파인튜닝을 적용하는 것은 전체 네트워크를 처음부터 훈련 할 필요가 없기 때문에 매우 강력한 기술입니다. 대신 풍부하고 차별적인 필터 세트로 구성된 ImageNet 데이터 세트에서 훈련된 최첨단 모델과 같은 기존 네트워크 아키텍처를 활용할 수 있습니다. 이러한 필터를 사용하여 학습을 “점프 시작”하여 네트워크 수술을 수행 할 수 있으며, 궁극적으로 처음부터 훈련하는 것보다 적은 노력으로 더 높은 정확도의 전이 학습 모델을 얻을 수 있습니다.

전이 학습 및 파인튜닝에 대한보다 실용적인 예를 보려면 나중에 나오는 다음 주제를 참조하십시오.

1. 차량의 제조업체와 모델을 인식합니다.

2. 이미지 방향을 자동으로 식별하고 수정합니다.

HDF5 LargeSize Data 딥러닝 인공지능 파이썬 python dataset

https://kdderas.io/

Indexs Layers 인공지능 딥러닝 MachineLearning fcheadnet Augmentation 파이썬 python Classification Fine Tuning Flowers17 VGG16

네트워크 수술을 수행하기 전에 주어진 딥러닝 모델에있는 모든 레이어의 레이어 이름과 인덱스를 알아야합니다. 사전 훈련 된 CNN에서 특정 레이어를 “고정” 및 “고정 해제” 해야 하므로 이 정보가 필요합니다. 레이어 이름과 인덱스를 미리 알지 못하면 우리는 계획이없는 통제 불능 외과 의사 처럼 “맹목적으로 절단” 할 것입니다. 대신 네트워크 아키텍처와 구현을 검토하는 데 몇 분을 투자하면 수술을 더 잘 준비 할 수 있습니다. 계속해서 VGG16의 레이어 이름과 인덱스를 살펴 보겠습니다.

새 파일을 열고 inspect_model.py라는 이름을 지정한 후 다음 코드를 삽입하십시오.

2행은 VGG16 Keras 구현을 가져옵니다. 이 네트워크는 우리가 검사하고 수술을 준비 할 네트워크입니다. 6-9 행은 명령행 인수를 구문 분석합니다. 여기에는 네트워크 헤드가 모델 요약에 포함되어야 하는지 여부를 나타내는 데 사용되는 단일 스위치가 필요합니다.

23 행과 24 행은 디스크에서 사전 훈련 된 ImageNet 가중치를 사용하여 VGG16을 로드합니다. 네트워크 헤드는 선택적으로 포함됩니다.

마지막으로 19 행과 20 행을 통해 모델을 조사 할 수 있습니다. 네트워크의 각 계층에 대해 해당 인덱스를 인쇄합니다. 이 정보가 주어지면 FC 헤드가 시작되는 위치 (및 새 FC 헤드로 교체 할 위치)의 색인을 알 수 있습니다. VGG16 아키텍처를 조사하려면 다음 명령을 실행하십시오.

여기서 우리는 레이어 20-22가 완전히 연결된 레이어임을 알 수 있습니다. 확인을 위해 inspect_model.py 스크립트를 다시 실행하고 이번에는 FC 헤드를 해제하는 스위치 –include-top -1을 제공합니다.

네트워크의 최종 계층이 POOL 계층인지 확인 하십시오 (특징 추출에 대한 23 장에서와 같이). 이 네트워크 바디는 파인튜닝의 시작점 역할을합니다.

사전 훈련 된 CNN의 헤드를 교체하기 전에 이를 교체 할 무언가가 필요합니다. 따라서 우리는 완전히 연결된 네트워크 헤드를 정의해야합니다. 시작하려면 nn.conv 하위 모듈에 fcheadnet.py라는 새 파일을 만듭니다.

그런 다음 fcheadnet.py를 열고 다음 코드를 삽입합니다.

이전 네트워크 구현과 마찬가지로 실제 네트워크 아키텍처를 구성하는 빌드 방법을 정의합니다. 이 방법에는 baseModel (네트워크 본문), 데이터 세트의 총 클래스 수, 마지막으로 완전 연결 계층의 노드 수 D의 세 가지 매개 변수가 필요합니다.

11 행은 네트워크를 나머지 본문 인 baseModel.output과 연결하는 headModel을 초기화합니다. 거기에서 12-17행은 다음과 같은 매우 간단한 완전 연결 아키텍처를 구축합니다.

다시 말하지만, 이 완전히 연결된 헤드는 4,096 FC 레이어의 두 세트로 구성된 VGG16의 원래 헤드에 비해 매우 단순합니다. 그러나 대부분의 파인튜닝 문제의 경우 네트워크의 원래 헤드를 복제하는 것이 아니라이를 단순화하여 파인튜닝이 더 쉽습니다. 헤드의 매개 변수가 적을수록 올바르게 수행 할 가능성이 높습니다. 새로운 분류 작업에 맞게 네트워크를 조정합니다. 마지막으로 라인 20은 새로 구성된 FC 헤드를 호출 함수로 반환합니다.

다음 섹션에서 볼 수 있듯이 네트워크 수술을 통해 VGG16의 헤드를 새로 정의 된 FCHeadNet으로 교체 할 것입니다.

AI DeepLearning MachineLearning Augmentation 전이학습 파이썬 python Classification Fine Tuning Flowers17

우리는 사전 훈련 된 컨볼루션 신경망을 피처 추출기로 취급하는 방법을 배웠습니다. 이 피처 추출기를 사용하여 네트워크를 통해 이미지 데이터 세트를 전달하고 지정된 계층에서 활성화를 추출하고 값을 디스크에 저장했습니다. 그런 다음 SIFT, HOG, LBP와 같은 수작업으로 엔지니어링 된 기능을 사용하는 경우와 똑같이 CNN 피처 위에 표준 기계 학습 분류기(이 경우 로지스틱 회귀)를 훈련했습니다. 이 전이 학습이라고하는 CNN 피처 추출기 접근 방식은 Animals, CALTECH-101 또는 Flowers-17 데이터 세트에 대한 이전 실험보다 훨씬 높은 정확도를 얻었습니다.

그러나 충분한 데이터가있는 경우 실제로 피처 추출 방법을 능가 할 수 있는 다른 유형의 전이 학습이 있습니다. 이 방법을 파인 튜닝이라고하며 “네트워크 수술”을 수행해야 합니다. 먼저, 메스를 가져와 VGG, ResNet 또는 Inception과 같은 사전 훈련 된 컨볼 루션 신경망에서 완전히 연결된 레이어의 최종 세트 (즉, 네트워크의 “헤드”)를 잘라냅니다. 그런 다음 head를 임의 초기화를 사용하여 완전히 연결된 새로운 레이어 세트로 교체합니다. 이 경우 head 아래의 모든 레이어가 고정되어 가중치를 업데이트 할 수 없습니다 (즉, 역 전파의 역방향 패스가 해당 레이어에 도달하지 않음).

그런 다음 새로운 FC 계층 세트가 네트워크에서 이전에 학습 된 CONV 계층에서 패턴을 학습 할 수 있도록 매우 작은 학습률을 사용하여 네트워크를 훈련시킵니다. 선택적으로 나머지 네트워크를 고정 해제하고 훈련을 계속할 수 있습니다. 파인 튜닝을 적용하면 사전 훈련 된 네트워크를 적용하여 원래 훈련되지 않은 클래스를 인식 할 수 있습니다. 또한 이 방법은 특징 추출보다 더 높은 정확도로 이어질 수 있습니다.

이 장의 나머지 부분에서는 네트워크 수술을 포함하여 미세 조정에 대해 자세히 설명합니다. 마지막으로 Flowers-17 데이터 세트에 미세 조정을 적용하고 지금까지 이 책에서 시도한 다른 모든 접근 방식을 능가하는 예제를 제공합니다.

파인 튜닝은 전이 학습의 한 유형입니다. 주어진 데이터 세트에서 이미 훈련 된 딥러닝 모델에 파인 튜닝을 적용합니다. 일반적으로 이러한 네트워크는 ImageNet 데이터 세트에서 학습 된 VGG, ResNet 및 Inception과 같은 최첨단 아키텍처입니다.

특성 추출에 대한 23 장에서 알 수 있듯이 이러한 네트워크에는 이미 훈련 된 데이터 세트 및 클래스 레이블 외부에 사용할 수있는 풍부하고 차별적인 필터가 포함되어 있습니다. 그러나 단순히 특징 추출을 적용하는 대신 네트워크 수술을 수행하고 실제 아키텍처를 수정하여 네트워크의 일부를 다시 훈련시킬 수 있습니다.

미세 조정의 작동 방식을 이해하려면 VGG16 네트워크의 계층이있는 아래 그림(왼쪽)을 보십시오. 아시다시피, 최종 레이어 세트 (즉, “헤드”)는 소프트맥스 분류기와 함께 완전히 연결된 레이어입니다. 미세 조정을 수행 할 때 실제로 피처 추출 (중간)과 마찬가지로 네트워크에서 헤드를 제거합니다. 그러나 피처 추출과 달리 파인튜닝을 수행 할 때 실제로 완전히 연결된 새로운 헤드를 만들어 원래 아키텍처 위에 배치합니다 (오른쪽).

왼쪽 : 원래 VGG16 네트워크 아키텍처.

중간 : VGG16에서 FC 레이어를 제거하고 최종 POOL 레이어를 피처 추출기로 처리합니다.

오른쪽 : 원래 FC 레이어를 제거하고 새 FC 헤드로 교체합니다. 그런 다음 이러한 새 FC 레이어를 특정 데이터 세트에 맞게 미세 조정할 수 있습니다 (이전 FC 레이어는 더 이상 사용되지 않음).

대부분의 경우 새 FC 헤드는 원래 FC 헤드보다 적은 매개 변수를 갖습니다. 그러나 실제로는 특정 데이터 세트에 따라 다릅니다. 새 FC 헤드는 무작위로 초기화되고 (새 네트워크의 다른 레이어와 마찬가지로) 원래 네트워크의 본체에 연결되며 훈련 할 준비가되었습니다.

그러나 문제가 있습니다. CONV 레이어는 이미 풍부하고 차별적 인 필터를 배웠지만 FC 레이어는 완전히 새롭고 무작위입니다. 그래디언트가 이러한 임의의 값에서 네트워크 본문을 통해 역전파되도록 허용하면 이러한 강력한 기능이 파괴될 위험이 있습니다. 이를 우회하기 위해 대신 아래 그림(왼쪽)에서와 같이 네트워크 본문의 모든 레이어를 “고정”(아이러니하게도)하여 FC 헤드를 “워밍업 (warm up)”합니다

왼쪽 : 미세 조정 프로세스를 시작할 때 네트워크의 모든 CONV 레이어를 고정하고 그라데이션이 FC 레이어를 통해 역전파되도록 허용합니다. 이렇게 하면 네트워크가 “워밍업”할 수 있습니다.

오른쪽 : FC 레이어가 워밍업 된 후 네트워크의 모든 레이어를 고정 해제하고 각 레이어를 미세 조정하도록 선택할 수 있습니다.

훈련 데이터는 평소처럼 네트워크를 통해 전파됩니다. 그러나 역전파는 FC 계층 이후에 중지되므로 이러한 계층이 매우 차별적 인 CONV 계층에서 패턴을 학습 할 수 있습니다. 경우에 따라 새 FC 헤드가 충분한 정확도를 얻을 수 있으므로 네트워크 본체를 고정 해제하지 않을 수 있습니다. 그러나 일부 데이터 세트의 경우 미세 조정 프로세스 중에 원본 CONV 레이어를 수정하는 것이 유리한 경우가 많습니다 (위 그림 오른쪽). FC 헤드가 데이터 세트에서 패턴을 배우기 시작한 후 훈련을 일시 중지하고 바디 부분을 고정 해제 한 다음 훈련을 계속하지만 매우 작은 학습 속도로 CONV 필터를 크게 벗어나고 싶지 않습니다. 그런 다음 충분한 정확성을 얻을 때까지 교육을 계속할 수 있습니다.

파인 튜닝은 사용자 지정 데이터 세트의 사전 훈련 된 CNN에서 이미지 분류기를 얻을 수 있는 매우 강력한 방법으로, 대부분의 경우 특징 추출보다 훨씬 더 강력합니다.

단점은 미세 조정에 약간의 작업이 필요할 수 있고 FC 헤드 매개 변수 선택이 네트워크 정확도에 큰 영향을 미친다는 것입니다. 네트워크가 이미 사전 교육을 받았으므로 여기서 정규화 기술에 엄격하게 의존 할 수 없습니다. 네트워크에서 이미 수행중인 정규화에서 벗어날 수 없습니다.

둘째, 소규모 데이터 세트의 경우 네트워크가 ‘콜드’ FC 시작에서 ‘학습’을 시작하도록 하는 것이 어려울 수 있습니다. 이것이 바로 네트워크 바디를 먼저 동결하는 이유입니다. 그럼에도 불구하고 워밍업 단계를 통과하는 것은 약간의 도전이 될 수 있으며 SGD 이외의 옵티 마이저를 사용해야 할 수도 있습니다 (27 장 참조). 미세 조정에는 약간의 노력이 필요하지만 올바르게 수행하면 거의 항상 더 높은 정확도를 만들 수 있습니다.

앙상블 CNN Jensen Inequality 평가 deepLearnging 파이썬 python

CNN 앙상블을 구성하고 평가하려면 test_ensemble.py라는 별도의 파일을 만들고 다음 코드를 삽입합니다.

2-9 행은 필요한 Python 패키지를 가져 오는 반면 12-15 행은 명령 줄 인수를 구문 분석합니다. 여기에는 직렬화 된 네트워크 가중치가 디스크에 저장되는 경로 인 –models가있는 단일 스위치 만 필요합니다.

여기에서 CIFAR-10 데이터 세트를 로드하여 네트워크를 평가할 뿐 (훈련이 아닌) 테스트 세트 만 유지할 수 있습니다

이제 Python에 내장 된 glob 모듈을 사용하여 쉽게 사전 훈련 된 MiniVGGNet 네트워크에 대한 경로를 수집해야합니다.

31 행은 –models 디렉토리의 모든 .model 파일에 대한 와일드 카드 경로 (파일 경로에 별표 “*”표시)를 구성합니다. 32 행에서 glob.glob을 사용하면 .model 파일 확장자로 끝나는 –models 내의 모든 파일 경로를 자동으로 찾을 수 있습니다.

32 행을 실행 한 후 modelPaths 목록에 다음 항목이 포함됩니다.

그런 다음 33 행은 디스크에서 로드 된 역 직렬화 된 MiniVGGNet 네트워크를 저장할 모델 목록을 초기화합니다. 이제 디스크에서 각 모델을로드 해 보겠습니다.

37 행에서는 각 개별 modelPath 파일 경로를 반복합니다. 그런 다음 load_model을 통해 직렬화 된 네트워크를 로드하고 모델 목록에 추가합니다. 마지막으로 앙상블을 평가할 준비가 되었습니다.

44 행에서 예측 목록을 초기화합니다. 모델 목록의 각 모델은 테스트 세트의 모든 데이터 포인트에 대해 10 개의 확률 (CIFAR-10 데이터 세트의 각 클래스 레이블에 대해 하나씩)을 생성합니다. CIFAR-10 데이터 세트에 10,000 개의 데이터 포인트가 있다고 가정하면 각 모델은 10,000×10 크기의 배열을 생성합니다. 각 행은 주어진 데이터 포인트에 해당하고 각 열은 해당 확률에 해당합니다.

이러한 예측을 누적하기 위해 47 행에서 각 개별 모델을 반복합니다. 그런 다음 테스트 데이터에서 .predict를 호출하고 각 모델에서 생성 된 확률로 예측 목록을 업데이트합니다. 앙상블의 5 개 모델을 반복하고 예측 목록을 업데이트 한 후, 예측 배열은 이제 (5, 10000, 10) 모양을 갖습니다. 즉, 각 모델에 대해 10 개의 클래스 레이블 확률을 생성 한 10,000 개의 테스트 데이터 포인트에 5 개의 모델이 있음을 의미합니다. 그런 다음 54 행은 5 개 모델 모두에서 각 테스트 데이터 포인트의 확률을 평균합니다.

이를 확인하기 위해 우리는 예측 배열의 모양을 보면 이제 (10000, 10) 5 개 모델 각각에 대한 확률이 함께 평균화 되었음을 의미합니다. 평균화는이 방법을 앙상블이라고 부르는 이유입니다. 여러 독립 모델의 출력을 가져 와서 함께 평균하여 최종 출력을 얻습니다. Jensen의 Inequality에 따르면 앙상블 방법을 적용하는 것은 개별 모델 중 하나를 무작위로 선택하는 것보다 (평균적으로) 더 나쁘지 않아야합니다.

마지막으로 55 행과 56 행은 앙상블 예측에 대한 분류 보고서를 표시합니다. MiniVGGNet 모델의 앙상블이 분류 정확도를 증가 시켰는지 확인하려면 다음 명령을 실행하십시오.

출력 분류 보고서를 보면 이러한 네트워크가 동일한 하이퍼 파라미터를 사용하여 동일한 데이터 세트에서 훈련되었지만 여러 네트워크의 출력을 결합하는 것만으로 정확도가 83 %에서 84 %로 증가했음을 알 수 있습니다. 일반적으로 데이터 세트에 따라 컨볼루션 신경망 앙상블을 적용 할 때 1-5 %의 정확도 증가를 기대할 수 있습니다.

이 장에서 우리는 앙상블 기계 학습 기술과 여러 개의 독립적 인 모델을 훈련 한 후 결과를 함께 평균화하여 분류 정확도를 높일 수있는 방법을 검토했습니다.

앙상블 방법에 대한 이론적 정당성은 Jensen의 Inequality 등을 검토하여 찾을 수 있습니다. Jensen의 Inequality는 평균적으로 무작위로 하나를 선택하는 것보다 여러 모델의 결과를 함께 평균하는 것이 좋다는 것입니다. 실제로 최첨단 논문 (Inception, ResNet 등 포함)에서 보고 한 상위 결과는 여러 모델의 평균입니다 (일반적으로 3-5개, 저자는 출판 기한 전에 네트워크를 훈련시켜야 하므로). 데이터 세트에 따라 일반적으로 정확도가 1~5 % 증가 할 것으로 예상 할 수 있습니다. 앙상블은 분류 정확도를 향상시키는 간단한 방법 일 수 있지만 단일 네트워크를 훈련하는 대신 계산 비용이 많이 드는 앙상블이지만 이제 N 개의 훈련을 할 수 있습니다. CNN 훈련은 이미 시간이 많이 걸리는 작업이므로 일부 상황에서는 선형으로 확장하는 방법이 실용적이지 않을 수 있습니다.

다중 모델 훈련의 계산 부담을 줄이기 위해 Huang et al. 2017 년 논문 Snapshot Ensembles : Train 1, get M for free에서 단일 학습 프로세스 동안 여러 모델을 학습하기 위해 순환 학습률 일정을 사용하는 아이디어를 제안합니다. 이 방법은 높은 학습률로 학습을 시작한다음 빠르게 낮추고 모델 가중치를 저장 한 다음 네트워크 가중치를 다시 초기화하지 않고 학습률을 원래 값으로 재설정하는 방식으로 작동합니다. 이 작업을 통해 네트워크는 훈련 과정 중에 이론적으로 지역 최소 영역 (또는 적어도 손실이 적은 영역)으로 커버리지를 여러 번 확장 할 수 있습니다. Snapshot Ensembles는 범위를 벗어나지만 분류 정확도를 높여야하지만 여러 모델을 교육 할 여유가 없는 경우 조사 할 가치가 있습니다.

파이썬 python Classification Ensemble 앙상블 Jensen Inequality 인공지능 딥러닝

CNN 앙상블을 구축하는 첫 번째 단계는 각 개별 CNN을 훈련하는 것입니다. 단일 CNN을 훈련하는 많은 예를 보았지만 여러 네트워크를 어떻게 훈련합니까? 일반적으로 두 가지 옵션이 있습니다.

1. 단일 네트워크를 여러 번 훈련하는 데 사용하는 스크립트를 실행하여 출력 직렬화 된 모델 가중치 경로를 각 실행에 대해 저장되도록 변경합니다.

2. for 루프를 사용하여 N 개의 네트워크를 훈련시키고 각 반복이 끝날 때 직렬화 된 모델을 출력하는 별도의 Python 스크립트를 만듭니다.

두 방법 모두 CNN의 간단한 앙상블을 훈련하는 데 완벽하게 허용됩니다. 단일 명령을 실행하여 단일 출력 CNN을 생성하는 것이 좀더 용이할 것으로 예상되니, 단일 스크립트가 여러 네트워크 훈련을 담당하는 두 번째 옵션을 시도해 보겠습니다. 새 파일을 열고 이름을 train_models.py로 지정하고 다음 코드를 삽입합니다.

2 행과 3 행은 matplotlib 패키지를 가져온 다음 플롯을 디스크에 저장할 수 있도록 백엔드를 설정합니다. 6-15 행은 나머지 Python 패키지를 가져옵니다. 이 모든 패키지는 이전에 사용했지만 아래에서 중요한 패키지를 언급하겠습니다.

• 8 행 : 앙상블을 구성하기 위해 여러 MiniVGGNet 모델을 훈련 할 것입니다.

• 9 행 : ImageDataGenerator 클래스를 사용하여 네트워크를 훈련 할 때 데이터 증가를 적용합니다.

• 10 행 및 11 행 : MiniVGGNet 모델은 SGD 옵티 마이저를 사용하여 CIFAR-10 데이터 세트에 대해 학습됩니다.

train_models.py 스크립트에는 두 개의 명령 줄 인수 다음에 추가 옵션 인수가 필요합니다.

–output 인수는 학습 할 각 네트워크에 대한 손실 / 정확도 플롯과 함께 분류 보고서를 저장하는 기본 출력 디렉토리 역할을합니다. 그런 다음 직렬화 된 네트워크 가중치를 저장할 출력 디렉토리의 경로를 제어하는 ​​–models 스위치가 있습니다.

마지막으로 –num-models 인수는 앙상블의 네트워크 수를 나타냅니다. 이 값의 기본값은 5 개입니다. Random Forests와 같은 전통적인 앙상블 방법은 일반적으로 30 개 이상의 의사 결정 트리 (대부분의 경우 > 100 개)로 구성되지만 일반적으로 앙상블에서 5 ~ 10개의 컨벌루션 신경망 만 볼 수 있습니다. 그 이유는 CNN이 훨씬 학습하는 데 시간과 계산 비용이 많이 들기 때문입니다.

다음 코드 블록은 디스크에서 CIFAR-10 데이터 세트를 로드하고, 픽셀 강도를 [0,1] 범위로 확장하고, 클래스 레이블을 원-핫 인코딩하여 손실 함수로 범주형 교차 엔트로피를 적용 할 수 있도록 처리합니다.

또한 ImageDataGenerator를 초기화하여 CIFAR-10 훈련 데이터에 데이터 증대를 적용 할 수 있습니다.

여기에서는 이미지를 무작위로 10도 회전하고 0.1 배씩 이동하고 무작위로 수평으로 뒤집을 수 있습니다. 이제 앙상블에서 각 개별 MiniVGGNet 모델을 훈련할 준비가되었습니다.

48 번 행에서 우리는 훈련 할 –num-models 수를 반복하기 시작합니다. 52 행은 학습률 α = 0.01, 모멘텀 γ = 0.9, 학습률의 표준 Keras 학습률 감소를 총 epoch 수로 나눈 값을 사용하여 SGD 최적화 프로그램을 초기화합니다. 또한 Nesterov 가속을 사용해야 함을 표시합니다.

54-57 행은 개별 MiniVGGNet 모델을 인스턴스화하고 컴파일합니다.

다음으로 네트워크를 훈련시키고 디스크에 직렬화하겠습니다.

60-62 행은 fit_generator 메서드를 사용하여 MiniVGGNet 모델을 훈련시킵니다. 데이터 증가를 적용하려면 ImageDataGenerator의 .flow 메서드가 필요하기 때문에 fit_generator를 사용합니다.

네트워크는 64 개의 배치 크기를 사용하여 총 64 epoch 동안 훈련됩니다. steps_per_epoch 매개 변수는 배치 크기로 나눈 훈련 샘플 수인 epoch 당 배치 수를 제어합니다.

네트워크가 훈련을 마친 후 고유한 출력 경로를 구성하고 가중치를 디스크에 저장합니다 (65 및 66 행). 또한 각 네트워크에 대한 classification_report를 디스크에 저장하여 스크립트 실행이 완료되면 성능을 검토 할 수 있습니다.

시간이 지남에 따라 손실과 정확도를 플로팅 할 때도 마찬가지입니다.

앙상블 학습으로 바로 뛰어 들지 않을 것입니다. 먼저 일련의 실험을 실행하여 특정 데이터 세트에서 가장 높은 정확도를 제공하는 아키텍처, 최적화 도구 및 하이퍼 파라미터 조합을 결정합니다.

이 최적의 조합 세트에 도달하면 여러 모델을 학습하여 앙상블을 형성합니다. 첫 번째 실험으로 앙상블을 훈련하는 것은 주어진 데이터 세트에 가장 적합한 아키텍처, 최적화 도구 및 하이퍼 파라미터의 조합을 모르기 때문에 조기 최적화로 간주됩니다. 즉, 이전에 SGD로 훈련 된 MiniVGGNet이 83 %의 합리적인 분류 정확도를 제공한다는 것을 알고 있습니다. 앙상블 방법을 적용하여 이 정확도를 높이기를 바래봅니다. MiniVGGNet 모델 세트를 훈련하려면 다음 명령을 실행하십시오.

이제 하나가 아닌 5 개의 네트워크를 훈련하고 있으므로이 스크립트를 실행하는 데 5 배의 시간이 걸립니다. 실행되면 출력 디렉토리를 살펴보십시오.

여기에서 각 네트워크에 대한 출력 분류 보고서와 훈련 곡선을 볼 수 있습니다. grep을 사용하여 각 네트워크의 분류 정확도를 쉽게 추출 할 수 있습니다.

5 개 네트워크 중 4 개는 83 %의 분류 정확도를 얻고 나머지 네트워크는 82 %의 정확도에 도달합니다. 또한 5 개의 훈련 플롯 (아래 그림)을 모두 살펴보면 각 학습 곡선 세트가 다소 비슷해 보이지만 각각 고유 해 보이며 각 MiniVGGNet 모델이 서로 다른 방식으로 “학습”되었음을 알 수 있습니다. 이제 5 개의 개별 앙상블을 훈련 했으므로 예측을 결합하고 분류 정확도가 증가하는지 확인할 때입니다.

앙상블의 5 개 네트워크 각각에 대한 훈련 및 검증 플롯

Image Net Challenge Inequality Inequality 앙상블

이 장에서는 앙상블 메서드의 개념, 여러 분류기를 가져와 하나의 큰 메타 분류기로 집계하는 프로세스를 살펴 봅니다. 여러 기계 학습 모델을 함께 평균화하면 무작위로 선택한 단일 모델을 사용하여 성능을 능가 (즉, 더 높은 정확도 달성) 할 수 있습니다. 사실, ImageNet Challenge에서 경쟁하는 거의 모든 최신 출판물은 Convolutional Neural Networks 앙상블에 대한 최상의 결과를보고합니다. 이 장에서는 Jensen의 Inequality 이론 (앙상블 방법이 의존하는 이론)에 대한 논의로 시작합니다. 여기에서 단일 스크립트에서 여러 CNN을 훈련하고 성능을 평가하는 방법을 보여 드리겠습니다. 그런 다음 이러한 CNN을 단일 메타 분류기로 결합하고 정확도가 증가하는 것을 확인합니다.

26.1 앙상블 방법

“앙상블 방법”이라는 용어는 일반적으로 “대량”모델 ( “large”의 정확한 값이 분류 작업에 따라 달라짐)을 훈련 한 다음 투표 또는 평균화를 통해 출력 예측을 결합하여 분류 정확도를 높이는 것을 말합니다. 실제로 앙상블 방법은 딥러닝 및 컨볼 루션 신경망에만 국한되지 않습니다. 우리는 수년간 앙상블 방법을 사용해 왔습니다. AdaBoost 및 Random Forests와 같은 기법은 앙상블 방법의 전형적인 예입니다. Random Forests에서는 여러 의사 결정 트리를 훈련하고 포리스트를 사용하여 예측합니다. 아래 그림 (왼쪽)에서 볼 수 있듯이 Random Forest는 함께 집계 된 여러 의사 결정 트리로 구성됩니다.

왼쪽 : 신경망의 앙상블은 여러 네트워크로 구성됩니다. 입력 이미지를 분류 할 때 데이터 포인트는 다른 모든 네트워크와 독립적으로 이미지를 분류하는 각 네트워크로 전달됩니다. 그런 다음 네트워크 전체의 분류를 평균하여 최종 예측을 얻습니다.

오른쪽 : Jensen의 Inequality 등으로 인해 앙상블 방법이 가능합니다. 항아리에 들어있는 사탕 수에 대한 추측을 평균하여 실제 사탕 수를 더 잘 추정 할 수 있습니다.

각 의사 결정 트리는 최종 분류가되어야한다고 생각하는 것에 “투표”합니다. 이러한 투표는 메타 분류 자에 의해 표로 작성되며 가장 많은 투표를 받은 카테고리가 최종 분류로 선택됩니다. 딥러닝과 컨볼루션 신경망에도 동일한 개념을 적용 할 수 있습니다. 여기서는 여러 네트워크를 훈련시킨 다음 각 네트워크에 입력 데이터 포인트가 주어지면 각 클래스 레이블에 대한 확률을 반환하도록 요청합니다 (위 그림 왼쪽). 이 확률은 함께 평균을 내고 최종 분류를 얻습니다. 여러 모델에 대한 평균 예측이 작동하는 이유를 이해하려면 먼저 Jensen의 Inequality에 대해 논의해야 합니다. 그런 다음 Python 및 Keras 코드를 제공하여 CNN 앙상블을 구현하고 분류 정확도가 실제로 증가하는지 직접 확인합니다.

26.1.1 Jensen의 Inequality

가장 일반적인 용어로 앙상블은 앙상블 컬렉션에서 단일 모델을 사용하는 것보다 더 나은 평균 예측 정확도를 얻는 데 사용할 수있는 유한한 모델 컬렉션입니다. Dietterich의 연구는 앙상블 방법이 일반적으로 단일 모델보다 높은 정확도를 얻을 수있는 이유에 대한 이론을 자세히 설명합니다.

Dietterich의 작업은 머신 러닝 문헌에서 ‘다양성’또는 ‘모호성 분해’로 알려진 Jensen의 Inequality 등에 달려 있습니다. Jensen의 Inequality에 대한 공식적인 정의에 따르면 볼록 결합 (평균) 앙상블은 개별 모델의 평균 오차보다 작거나 같은 오차를 갖게됩니다. 하나의 개별 모델이 모든 모델의 평균보다 오류가 낮을 수 있지만 이 모델을 “선택”하는 데 사용할 수있는 기준이 없기 때문에 모든 모델의 평균이 다음보다 더 나쁘지 않을 것임을 확신 할 수 있습니다. 임의의 단일 모델을 선택합니다. 요컨대, 우리는 예측을 함께 평균화 해야만 더 나아질 수 있습니다. 분류기를 악화시키는 것을 두려워 할 필요가 없습니다.

시각적 인 예를 좋아하는 사람들에게는 Jensen의 Inequality과 모델 평균화의 개념을 이 사탕 항아리를 보고 안에 얼마나 많은 사탕이 들어 있는지 추측하여 가장 잘 설명 할 수 있습니다 (위 그림 오른쪽). 사탕이 몇 개나 될까요? 100? 200? 500? 당신의 추측은 항아리에있는 실제 사탕 수보다 매우 많거나 적을 수 있습니다. 매우 가까울 수도 있습니다. 또는 운이 좋다면 정확한 사탕 수를 추측 할 수 있습니다. 하지만 이 게임에는 약간의 트릭이 있습니다. 이는 Jensen의 Inequality을 기반으로합니다. 항아리에 사탕이 몇 개 있는지 물어 보면 여러분과 다른 모든 사람들에게 가서 사탕 개수가 무엇이라고 생각하는지 물어 보겠습니다. 그런 다음이 모든 추측을 취하고 함께 평균을 내고이 평균을 최종 예측으로 사용합니다.

이제 여러분 중 소수가 정말 좋은 추측을 하고 평균을 이길 수도 있을 것입니다. 하지만 어느 쪽이 정말 좋은 추측인지 판단 할 기준이 없습니다. 누가 최고의 추측인지 말할 수 없기 때문에 대신 내가 묻는 모든 사람의 평균을 취하겠습니다. 따라서 무작위로 추측하는 것보다 (평균적으로) 나쁘지 않을 것입니다. 본질적으로 그것은 Jensen의 Inequality입니다.

무작위로 추측하는 사탕 수와 딥러닝 모델의 차이점은 CNN이 잘 작동하고 좋은 추측 성능을 가진 자 (즉, 무작위로 추측하지 않음)라고 가정한다는 것입니다. 따라서 이러한 예측 변수의 결과를 함께 평균하면 분류 정확도가 향상되는 경우가 많습니다. 이러한 개선 사항은 딥러닝에 대한 최신 출판물이 여러 모델을 훈련 한 다음 이러한 앙상블에 대한 최고의 정확성을 나타내는 이유입니다

DeepLearning MachineLearning Optimization SGD Stochastic Gradient Descent Adagrad Adadelta RMSprop Adam Nadam

이러한 모든 최적화 알고리즘 중에서 선택을 할 때 어떤 것을 선택해야합니까? 불행히도 그 대답은 결정적이지 않습니다. Schaul et al. 2014 년에 확률 적 최적화를위한 단위 테스트 논문에서는 이러한 최적화 방법 중 많은 것을 벤치마킹하려고 시도했으며 적응형 학습률 알고리즘이 호의적으로 수행되었지만 확실한 승자는 없음을 발견했습니다.

딥러닝 최적화 알고리즘 (그리고 이를 어떤 방법을 선택하는 것)은 여전히 ​​열린 연구 영역이며 수년 동안 계속 될 것입니다. 따라서 찾을 수있는 모든 최적화 알고리즘을 철저히 시도하고 각 알고리즘을 데이터 세트에 던지고 고정되는 사항에 주목하는 대신 2 ~ 3 개의 최적화 알고리즘을 마스터하는 것이 좋습니다.

종종 딥 러닝 프로젝트의 성공은 최적화 알고리즘 (및 관련 매개 변수)과 연구원이 알고리즘을 “driving”하는 데 얼마나 능숙한 지의 조합입니다.

27.2.1 Driving 세 가지 방법 : SGD, Adam 및 RMSprop

“이 시점에서 어떤 알고리즘을 사용할 지 선택하는 것은

사용자가 알고리즘에 익숙한 지(하이퍼 파라미터 조정의 용이함에)

크게 좌우되는 것 같습니다.” – Goodfellow et al.

RMSprop 및 Adam과 같은 적응형 학습률 알고리즘의 성공을 감안할 때 SGD를 무시하고 이를 구식 도구처럼 취급하고 싶을 수 있습니다. 결국 “더 나은” 방법이 존재 하겠죠? 그러나 SGD를 무시하는 것은 큰 실수가 될 것입니다. ImageNet과 같은 까다로운 이미지 분류 데이터 세트에 대한 최신 딥 러닝 간행물을 살펴보십시오. AlexNet, VGGNet, SqueezeNet, Inception, ResNet – 이러한 모든 최신 아키텍처는 SGD를 사용하여 학습 되었습니다.

그 이유가 무엇일까요? 적응형을 적용하는 알고리즘(RMSprop 및 Adam과 같은 학습률) 의 이점은 분명히 합니다. – 네트워크는 더 빨리 수렴 할 수 있습니다. 그러나 수렴 속도는 중요하지만 가장 중요한 요소는 아닙니다. 하이퍼 파라미터가 여전히 우세합니다. 하이퍼 파라미터를 주어진 최적화 프로그램 (및 관련 모델)으로 조정할 수없는 경우 , 네트워크는 합리적인 정확도를 얻을 수 없습니다. SGD는 적응형 학습률 알고리즘보다 확실히 더 느리게 수렴되지만 더 많이 연구 된 알고리즘이기도합니다. 연구원들은 SGD에 더 익숙하고 이를 사용하여 네트워크를 훈련하는 데 수년을 보냈습니다.

예를 들어, 5년 동안 동일한 제조사와 모델의 경주 용 자동차를 운전해 온 전문 경주용 자동차 운전자를 생각해보십시오. 그러다 어느 날 운전자의 스폰서가 바뀌고 강제로 새 차량을 운전하게됩니다. 운전자는 새 경주 용 자동차를 시험해 볼 시간이 없으며 자동차에 대한 경험없이 경주를 시작해야합니다. 드라이버가 처음 몇 번의 레이스에서도 잘 수행 할 수 있습니까? 대부분 그렇지 않습니다. 운전자는 차량과 그 복잡한 점에 익숙하지 않습니다 (그러나 운전자는 결국 전문가이기 때문에 여전히 합리적으로 수행 할 수는 있습니다).

딥 러닝 아키텍처와 최적화 알고리즘도 마찬가지입니다. 주어진 아키텍처 및 최적화 알고리즘으로 더 많은 실험을 수행할수록 훈련 프로세스의 복잡성에 대해 더 많이 알게됩니다. SGD가 거의 60 년 동안 신경망 훈련의 초석 이었음을 감안할 때 이 알고리즘이 오늘날에도 일관되게 사용되는 것은 놀라운 일이 아닙니다. 수렴 속도는 모델의 성능 (정확성)과 비교할 때 그다지 중요하지 않습니다.

간단히 말해, SGD를 사용하여 주어진 데이터 세트에서 더 높은 정확도를 얻을 수 있다면 단순히 하이퍼 파라미터를 더 잘 이해하기 때문에 Adam 또는 RMSprop를 사용할 때보 다 학습하는 데 1.5 배 더 오래 걸리더라도 SGD를 사용할 가능성이 높습니다. 현재 가장 많이 사용되는 딥러닝 최적화 알고리즘은 다음과 같습니다.

1. SGD

2. RMSprop

3. Adam

먼저 SGD를 마스터하고 만나는 모든 아키텍처 및 데이터 세트에 적용하는 것이 좋습니다. 일부 경우에 성능이 우수하고 다른 경우에는 성능이 떨어집니다. 여기서 목표는 특정 최적화 알고리즘을 사용하여 가능한 한 많은 딥러닝 문제에 노출되고 관련 하이퍼 파라미터를 조정하는 방법을 배우는 것입니다. 딥 러닝은 과학이자 예술입니다. 최적화 알고리즘을 마스터하는 것은 절대적으로 많은 연습이 필요한 예술입니다.

거기에서 RMSprop 또는 Adam으로 이동하십시오. 제 경험상 Adam은 대부분의 상황에서 RMSprop를 능가하는 경향이 있으므로 RMSprop보다 먼저 Adam을 공부하는 것이 좋습니다.

27.3 요약

이 장에서는 SGD 대신 사용할 수있는 적응형 학습률 최적화 알고리즘에 대해 설명했습니다. 심층 신경망을 훈련하기 위해 최적화 알고리즘을 선택하는 것은 다음과 같은 지식에 크게 좌우됩니다.

1. 데이터 세트

2. 모델 아키텍처

3. 최적화 알고리즘 (및 관련 하이퍼 파라미터)

찾을 수있는 모든 최적화 알고리즘을 시도하기 위해 철저하게 실험을 실행하는 대신 두,세가지 기술과 하이퍼 파라미터를 조정하는 방법을 마스터하는 것이 좋습니다. 이러한 기술의 전문가가되면 이전에 사용하지 않은 데이터 세트에 새로운 모델 아키텍처를 훨씬 쉽게 적용 할 수 있습니다. 개인적으로 추천하는 것은 딥러닝 공부 초기에 SGD 사용법을 마스터하는 데 많은 시간을 보내는 것입니다. 특히, 모멘텀이 있는 SGD입니다. SGD를 다양한 아키텍처 및 데이터 세트에 적용하는 것이 편하다면 Adam 및 RMSprop로 이동하십시오.

마지막으로, 모델 속도 수렴의 속도는 손실과 정확도의 부차적 이라는 점을 염두에 두십시오. 하이퍼 파라미터를 (자신있게) 조정할 수있는 최적화 알고리즘을 선택하여 합리적으로 성능을 발휘하는 네트워크를 만듭니다.

파이썬 python 딥러닝 최적화 SDG Gradient Descent Optimazation

지금까지는 네트워크를 최적화하기 위해 SGD (Stochastic Gradient Descent) 만 연구하고 사용했지만 딥 러닝에 사용되는 다른 최적화 방법이 있습니다. 특히 이러한 고급 최적화 기술은 다음 중 하나를 추구합니다.

1. 합리적인 분류 정확도를 얻기 위해 시간 (즉, 에포크 수)을 줄입니다.

2. 학습률 이외의 더 넓은 범위의 하이퍼 파라미터에 대해 네트워크를 더 “잘 작동”하도록 만듭니다.

3. 이상적으로는 SGD로 가능한 것보다 더 높은 분류 정확도를 얻을 수 있습니다.

딥 러닝의 최신 방법으로 각각 SGD를 개선하고 적응형 학습률 개념을 제공하고자하는 새로운 최적화 기술이 폭발적으로 증가했습니다. 아시다시피 SGD는 주어진 학습률에 비례하여 네트워크의 모든 매개 변수를 동일하게 수정합니다. 그러나 네트워크의 학습률이 (1) 조정해야 할 가장 중요한 하이퍼 파라미터이고 (2) 올바르게 설정하기가 어렵고 지루한 하이퍼 파라미터라는 점을 감안할 때 딥 러닝 연구자들은 일부 경우 학습률을 네트워크가 훈련됨에 따라 (매개 변수 당) 적응적으로 조정할 필요가 있다고 가정했습니다. 이 장에서는 적응형 학습률 방법을 검토합니다. 또한 자신의 프로젝트에서 사용해야하는 최적화 알고리즘에 대한 제안도 제공합니다

이 섹션의 각 최적화 알고리즘을 이해하기 위해 의사 코드 (특히 업데이트 단계) 측면에서 이를 조사 할 것입니다. 콘텐츠를 보다 쉽게 ​​이해할 수 있도록 이러한 방법에 대한 설명을 확장 (경우에 따라 단순화) 할 것입니다. 시작하려면 이미 익숙한 알고리즘 인 바닐라 SGD의 업데이트 단계를 살펴 보겠습니다.

W += -lr * dW

여기에 세 가지 값이 있습니다.

1. W : 가중치 행렬.

2. lr : 학습률.

3. dW : W의 기울기입니다.

여기서 우리의 학습률은 고정되어 있으며, 충분히 작 으면 훈련 중에 손실이 감소 할 것임을 압니다. 이전에 모멘텀과 Nesterov 가속화를 통합하는 SGD의 확장도 확인했습니다.이 표기법을 고려하여 딥 러닝 경력에서 접하게 될 일반적인 적응 형 학습률 최적화 도구를 살펴 보겠습니다.

27.1.1 Adagrad

우리가 탐구 할 첫 번째 적응 형 학습률 방법은 Duchi et al에 의해 처음 소개 된 Adagrad입니다. Adagrad는 학습률을 네트워크 매개 변수에 맞게 조정합니다. 자주 변경되지 않는 매개 변수에 대해 더 큰 업데이트가 수행되고 자주 변경되는 매개 변수에 대해 작은 업데이트가 수행됩니다. 아래에서 Adagrad 업데이트의 의사 코드 표현을 볼 수 있습니다.

cache += (dW ** 2)

W += -lr * dW / (np.sqrt(cache) + eps)

여기서 눈에 띄는 첫 번째 매개 변수는 캐시입니다.이 변수는 제곱 기울기의 매개 변수 당 합계를 유지하며 학습 프로세스의 모든 미니 배치에서 업데이트됩니다. 캐시를 검사하여 자주 업데이트되는 매개 변수와 자주 업데이트되는 매개 변수를 확인할 수 있습니다.

그런 다음 lr * dx를 캐시의 제곱근으로 나눌 수 있습니다 (매끄럽게하기 위해 엡실론 값을 더하고 0 오류로 나누는 것을 방지). 이전의 모든 제곱 그래디언트 합계로 업데이트 크기를 조정하면 네트워크의 매개 변수를 적응적으로 업데이트 할 수 있습니다.

캐시에서 자주 업데이트되거나 큰 기울기가있는 가중치는 업데이트 크기를 축소하여 매개 변수의 학습률을 효과적으로 낮 춥니 다. 반면, 캐시에 자주 업데이트되지 않거나 더 작은 기울기가있는 가중치는 업데이트 크기를 확장하여 특정 매개 변수에 대한 학습률을 효과적으로 높입니다.

Adagrad의 주요 이점은 더 이상 학습률을 수동으로 조정할 필요가 없다는 것입니다. 대부분의 Adagrad 알고리즘 구현은 초기 학습률을 0.01로 유지하고 알고리즘의 적응 형 특성으로 인해 매개 변수별로 학습률을 조정할 수 있습니다.

그러나 Adagrad의 약점은 캐시를 검사하여 확인할 수 있습니다. 각 미니 배치에서 제곱 기울기가 분모에 누적됩니다. 그래디언트가 제곱 (따라서 항상 양수)이므로이 누적은 훈련 과정에서 계속 증가합니다. 아시다시피, 작은 수 (그라데이션)를 매우 큰 수 (캐시)로 나누면 네트워크가 실제로 나중에 어떤 것을 학습하기에는 너무 작은 업데이트가 발생합니다.

이 현상은 작은 경우에도 발생합니다. 캐시의 양수 값이 단조롭게 증가함에 따라 드물게 업데이트되는 매개 변수는 Adagrad가 (최신) 딥 러닝 신경망을 훈련하는 데 거의 사용되지 않는 이유입니다. 그러나 Adagrad 알고리즘의 확장을 이해할 수 있도록 검토하는 것이 중요합니다.

27.1.2 Adadelta

Adadelta 알고리즘은 Zeiler가 2012 년 논문 ADADELTA : 적응형 학습률 방법에서 제안했습니다. Adadelta는 캐시로 인해 단조롭게 감소하는 학습률을 줄이는 Adagrad의 확장으로 볼 수 있습니다.

Adagrad 알고리즘에서는 이전에 제곱 된 모든 그라디언트로 캐시를 업데이트합니다. 그러나 Adadelta는 적은 수의 과거 그래디언트만 누적하여 이 캐시 업데이트를 제한합니다. 실제로 구현 될 때이 작업은 모든 과거 제곱 그래디언트의 감쇠 평균을 계산하는 것과 같습니다. 따라서 Adadelta는 Adagrad의 개선점으로 볼 수 있습니다. 그러나 매우 밀접하게 관련된 RMSprop 알고리즘 (캐시 붕괴도 수행함)이 종종 Adadelta보다 선호됩니다.

27.1.3 RMSprop

Adadelta와 독립적으로 개발 된 RMSprop 알고리즘은 Geoffrey Hinton의 Coursera 클래스 슬라이드에 표시된 (미공개) 최적화 알고리즘입니다. Adadelta와 마찬가지로 RMSprop은 캐시를 지수 가중치 이동 평균으로 변환하여 전역적으로 누적 된 캐시의 부정적인 영향을 수정하려고합니다. RMSprop 의사 코드 업데이트를 살펴 보겠습니다.

cache = decay_rate * cache + (1 – decay_rate) * (dW ** 2)

W += -lr * dW / (np.sqrt(cache) + eps)

RMSprop의 첫 번째 측면은 가중치 행렬 W에 대한 실제 업데이트가 Adagrad의 업데이트와 동일하다는 것입니다. 여기서 중요한 것은 캐시가 업데이트되는 방식입니다. 종종 ρ로 정의되는 decay_rate는 일반적으로 0.9로 설정되는 하이퍼 파라미터입니다. 여기서 우리는 캐시의 이전 항목이 새 업데이트보다 훨씬 더 작은 가중치를 갖는 것을 볼 수 있습니다. RMSprop의 이러한 “이동 평균”측면을 통해 캐시는 이전 제곱 그래디언트를 “leak out”하여 새로운 “fresher” 그래디언트로 대체 할 수 있습니다.

다시 말하지만, W에 대한 실제 업데이트는 알고리즘 힌지의 핵심인 Adagrad와 동일합니다. 캐시를 기하 급수적으로 감소시켜 학습 과정에서 학습률이 단조롭게 감소하는 것을 방지 할 수 있습니다. 실제로 RMSprop은 다양한 딥 러닝 네트워크를 학습하는 데 적용 할 때 Adagrad와 Adadelta보다 더 효과적입니다. 또한 RMSprop은 SGD보다 훨씬 빠르게 수렴하는 경향이 있습니다.

SGD 외에 RMSprop는 최근 딥 러닝 문헌에서 두 번째로 가장 많이 사용 된 최적화 알고리즘이었습니다. 그러나 우리가 논의 할 다음 최적화 방법 인 Adam은 이제 RMSprop보다 더 많이 사용되고 있습니다.

27.1.4 Adam

Kingma와 Ba가 2014 년 논문 Adam : A Method for Stochastic Optimization에서 제안한 Adam (Adaptive Moment Estimation) 최적화 알고리즘은 기본적으로 모멘텀이 추가 된 RMSprop입니다.

m = beta1 * m + (1 – beta1) * dW

v = beta2 * v + (1 – beta2) * (dW ** 2)

x += -lr * m / (np.sqrt(v) + eps)

m과 v의 값은 시간 t-1의 이전 값에 따라 SGD 모멘텀과 유사합니다. 값 m은 기울기의 첫 번째 모멘트 (평균)를 나타내고 v는 두 번째 모멘트 (분산)를 나타냅니다.

W에 대한 실제 업데이트는 RMSprop와 거의 동일합니다. 이제 우리는 원시 그래디언트 dW가 아닌 m의 “평활화 된”버전 (평균 계산으로 인해)을 사용하고 있습니다. 평균을 사용하면 가능한 한 더 바람직한 업데이트로 이어질 수 있습니다. 원시 dW 값에서 노이즈 한 업데이트를 부드럽게 처리합니다. 일반적으로 beta1은 0.9로 설정되고 beta2는 0.999로 설정됩니다. 이 값은 Adam 최적화 프로그램을 사용할 때 거의 변경되지 않습니다.

실제로 Adam은 많은 상황에서 RMSprop보다 더 잘 작동하는 경향이 있습니다. Adam 최적화 알고리즘에 대한 자세한 내용은 Kingma 및 Ba를 참조하십시오.

27.1.5 Nadam

Adam이 모멘텀이있는 RMSprop 인 것처럼 Nadam은 Nesterov 가속이 있는 RMSprop입니다. Nadam은 Timothy Dozat 스탠포드 대학 박사 과정 학생에 의해 제안 되었습니다. 우리는 일반적으로 Nadam이 “실제 응용” 에서 사용되는 것을 보지 못하지만, 이러한 Adam 변형이 존재한다는 것을 이해하는 것이 중요합니다.