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 개 네트워크 각각에 대한 훈련 및 검증 플롯