이 예에서는 이전 섹션과 동일한 학습 프로세스의 예를 하나만 추가하여 적용 할 것입니다. 데이터 augmentaion을 적용 할 것입니다. 데이터 augmentaion이 과적합을 방지하면서 분류 정확도를 높이는 방법을 확인하려면 새 파일을 열고 이름을 minivggnet_flowers17_data_aug.py로 지정한 다음 작업을 시작해 보겠습니다.

import는 데이터 증가에 사용되는 ImageDataGenerator 클래스를 가져 오는 9 행을 제외하고 minivggnet_flowers17.py에서와 동일합니다. 다음으로 명령 줄 인수를 구문 분석하고 이미지 경로에서 클래스 이름을 추출해 보겠습니다.

디스크에서 데이터 세트를로드하고 학습 / 테스트 분할을 구성하고 라벨을 인코딩합니다.

다음 코드 블록은 ImageDataGenerator를 초기화하므로 매우 중요합니다.

여기에서 이미지를 다음과 같이 설정할 수 있습니다.
1. 무작위로 ± 30도 회전
2. 수평 및 수직으로 0.2 배 이동
3. 0.2만큼 기울임
4. [0.8, 1.2] 범위에서 균일하게 샘플링하여 확대 / 축소
5. 무작위 수평으로 플립
정확한 데이터 세트에 따라 이러한 데이터 증가 값을 조정하고 싶을 것입니다. 응용 프로그램에 따라 [10,30] 사이의 회전 범위를 보는 것이 일반적입니다. 수평 및 수직 이동은 일반적으로 [0.1,0.2] 범위에 속합니다 (확대 / 축소 값도 동일). 이미지를 수평으로 뒤집 으면 클래스 레이블이 변경되지 않는 한 항상 수평 뒤집기를 포함해야합니다.
이전 실험에서와 같이 SGD 최적화 프로그램을 사용하여 MiniVGGNet을 학습합니다.

네트워크 훈련에 사용되는 코드는 이제 이미지 생성기를 사용하고 있으므로 약간 변경해야합니다

모델의 .fit 메서드를 호출하는 대신 이제 .fit_generator를 호출해야합니다. .fit_generator의 첫 번째 매개 변수는 훈련 데이터에서 새로운 훈련 샘플을 생성하는 데 사용되는 데이터 증가 함수 인 aug.flow입니다. aug.flow에서는 학습 데이터와 해당 레이블을 전달해야합니다. 또한 생성기가 네트워크를 훈련 할 때 적절한 배치를 구성 할 수 있도록 배치 크기를 제공해야합니다.
그런 다음 validation_data를 (testX, testY)의 2- 튜플로 제공합니다.이 데이터는 모든 epoch이 끝날 때 유효성 검사에 사용됩니다. steps_per_epoch 매개 변수는 epoch 당 배치 수를 제어합니다. 총 훈련 샘플 수를 배치 크기로 나누고 정수로 변환하여 적절한 steps_per_epoch 값을 프로그래밍 방식으로 결정할 수 있습니다. 마지막으로 epochs는 네트워크가 훈련되어야하는 총 epoch 수를 제어합니다 (이 경우 100 epoch). 네트워크를 훈련 한 후 이를 평가하고 해당 정확도 / 손실 플롯을 플로팅합니다

검증 데이터에 데이터 증가를 적용하지 않는 방법에 주목하십시오. 훈련 세트에만 데이터 증대를 적용합니다. 데이터 증가를 사용하여 Flowers-17에서 MiniVGGNet을 훈련하려면 다음 명령을 실행하십시오.
네트워크가 훈련을 마치면 즉시 정확도가 64 %에서 71 %로 증가하여 이전 실행보다 10.9 % 향상되었음을 알 수 있습니다. 그러나 정확성이 전부는 아닙니다. 실제 문제는 데이터 증대가 과적 합을 방지하는 데 도움이되었는지 여부입니다. 이 질문에 답하려면 아래 그림의 손실 및 정확도 플롯을 조사해야합니다.

MiniVGGNet을 데이터 증가로 Flowers-17에 적용합니다. 과적합은 여전히 문제입니다. 그러나 우리는 상당히 높은 분류 정확도와 낮은 손실을 얻을 수 있습니다.
여전히 과적합이 발생하고 있지만 데이터 증가를 사용하면 그 효과가 크게 감소합니다. 다시 말하지만,이 두 실험은 동일하다는 점을 명심하십시오. 우리가 만든 유일한 변경 사항은 데이터 증대 적용 여부 였습니다. 정규화에 영향을 미치는 데이터 증대를 확인할 수도 있습니다. 우리는 검증 정확도를 높일 수 있었기 때문에 훈련 정확도가 낮아 졌음에도 불구하고 모델의 일반화 가능성을 개선 할 수있었습니다.
시간이 지남에 따라 학습률을 감소 시키면 더 많은 정확도를 얻을 수 있습니다. 학습률은 이 장에서 특별히 제외되었으므로 Convolutional Neural Networks를 훈련 할 때 정규화자가 갖는 영향 데이터 증가에만 집중 하도록 합니다.
데이터 augmentation은 훈련 데이터에서 작동하는 정규화 기법의 한 유형입니다. 이름에서 알 수 있듯이 데이터 augmentation은 일련의 무작위 변환, 회전, 전단 및 뒤집기를 적용하여 훈련 데이터를 무작위로 변환합니다. 이러한 단순 변환을 적용해도 입력 이미지의 클래스 레이블은 변경되지 않습니다. 그러나 각 augmentation 이미지는 훈련 알고리즘이 이전에 보지 못했던 “새로운”이미지로 간주 될 수 있습니다. 따라서 우리의 훈련 알고리즘은 새로운 훈련 샘플과 함께 지속적으로 제공되어 더 강력하고 차별적인 패턴을 학습 할 수 있습니다.
결과에서 알 수 있듯이 데이터 증가를 적용하면 분류 정확도가 향상되는 동시에 과적합의 영향을 완화하는 데 도움이됩니다. 또한 데이터 증대를 통해 클래스 당 60 개의 샘플에 대해서만 Convolutional Neural Network를 훈련시킬 수있었습니다. 이는 클래스 당 제안 된 1,000 ~ 5,000 개 샘플보다 훨씬 적습니다.
“자연스러운”교육 샘플을 수집하는 것이 항상 더 좋지만, 데이터 확대는 작은 데이터 세트 제한을 극복하는 데 사용할 수 있습니다. 자신의 실험에 관해서는 실행하는 거의 모든 실험에 데이터 augmentation을 적용해야합니다. CPU가 입력을 무작위로 변환하는 룰이 있기 때문에 약간의 성능 저하가 있습니다. 그러나 이 성능 저하는 스레딩을 사용하고 네트워크 훈련을 담당하는 스레드로 전달되기 전에 백그라운드에서 데이터를 보강하여 완화됩니다.
시간을내어 이 기술에 익숙해지면 더 나은 성능의 딥 러닝 모델 (더 적은 데이터 사용)을 더 빨리 얻을 수 있습니다.