Goodfellow et al.에 따르면, 정규화는 “일반화 오류를 줄이기 위한 학습 알고리즘의 수정이 훈련 오류를 줄이려는 것이 아닙니다.”. 간단히 말해서 정규화는 훈련 오류를 약간 증가시키는 대신 테스트 오류를 줄이려고 합니다.
이미 앞 8 장에서 다양한 형태의 정규화를 살펴 보았습니다. 그러나 이는 매개 변수화 된 정규화 형식이어서 손실 / 업데이트 함수를 업데이트해야합니다. 실제로 다음과 같은 다른 유형의 정규화 방법이 있습니다.
1. 네트워크 아키텍처 자체를 수정합니다.
2. 훈련을 위해 네트워크로 전달되는 데이터를 확장합니다.
드롭 아웃은 일반화 가능성을 높여 네트워크 아키텍처를 수정하는 좋은 예입니다. 이전 계층에서 다음 계층으로 노드를 무작위로 연결 해제하는 계층을 삽입하여 단일 노드가 주어진 클래스를 나타내는 방법을 학습하지 않도록 하는 것입니다.
이 장의 나머지 부분에서는 데이터 증강이라는 또 다른 유형의 정규화에 대해 설명합니다. 이 방법은 훈련 예제를 훈련을 위해 네트워크로 전달하기 전에 의도적으로 훈련 예제를 교란시키고 모양을 약간 변경합니다.
최종 결과는 네트워크가 원래 훈련 데이터에서 생성 된 “새로운” 훈련 데이터 포인트를 지속적으로 확인하여 더 많은 훈련 데이터를 수집해야 하는 필요성을 부분적으로 완화합니다 (일반적으로 더 많은 훈련 데이터를 수집해도 알고리즘에는 거의 영향을 미치지 않음).
22.1 데이터 증강이란 무엇인가?
데이터 증가는 클래스 레이블이 변경되지 않도록 임의의 지터 및 교란을 적용하여 원본에서 새로운 훈련 샘플을 생성하는 데 사용되는 광범위한 기술을 포함합니다. 데이터 증대를 적용 할 때 우리의 목표는 모델의 일반화 가능성을 높이는 것입니다. 네트워크가 지속적으로 약간 수정 된 새 버전의 입력 데이터 포인트를 보고 있다는 점을 감안할 때 더 강력한 기능을 학습 할 수 있습니다. 테스트시에는 데이터 증대를 적용하지 않고 훈련 된 네트워크를 평가하지 않습니다. 대부분의 경우 훈련 정확도가 약간 떨어지더라도 테스트 정확도가 향상되는 것을 확인할 수 있습니다.

왼쪽 : 정규 분포를 정확히 따르는 250 개의 데이터 포인트 샘플.
오른쪽 : 소량의 무작위 “지터”를 분포에 추가합니다. 이러한 유형의 데이터 증대는 네트워크의 일반화 가능성을 높일 수 있습니다.
평균이 0이고 단위 분산이있는 정규 분포의 위 그림 (왼쪽)을 고려해 보겠습니다. 이 데이터에 대한 기계 학습 모델을 학습하면 분포를 정확하게 모델링 할 수 있습니다. 그러나 실제 애플리케이션에서는 데이터가 이러한 깔끔한 분포를 거의 따르지 않습니다.
대신, 분류기의 일반화 가능성을 높이기 위해 먼저 무작위 분포 (오른쪽)에서 가져온 일부 값 ε을 추가하여 분포를 따라 점을 무작위로 지 터링 할 수 있습니다. 우리의 플롯은 여전히 대략 정규 분포를 따르지만 왼쪽과 같이 완벽한 분포는 아닙니다. 이 데이터에 대해 훈련 된 모델은 훈련 세트에 포함되지 않은 예제 데이터 포인트로 일반화 될 가능성이 더 높습니다.
컴퓨터 비전의 맥락에서 데이터 증강은 자연스러운 것입니다. 예를 들어, 무작위와 같은 간단한 기하학적 변환을 적용하여 원본 이미지에서 추가 훈련 데이터를 얻을 수 있습니다. (작은) 입력 이미지에 대한 이러한 변환의 양은 모양이 약간 변경되지만 클래스 레이블은 변경되지 않습니다. 따라서 데이터 증가는 컴퓨터 비전 작업을위한 딥 러닝에 적용 할 수있는 매우 자연스럽고 쉬운 방법입니다. 컴퓨터 비전에 적용되는 데이터 증대를위한보다 진보 된 기술에는 주어진 색 공간에서 색상의 무작위 교란과 비선형 기하학적 왜곡이 있습니다.
컴퓨터 작업에 적용되는 데이터 증가를 이해하는 가장 좋은 방법은 주어진 입력이 증가되고 왜곡되는 것을 시각화하는 것입니다. 이 시각화를 수행하기 위해 Keras의 내장 된 기능을 사용하여 데이터 증대를 수행하는 간단한 Python 스크립트를 작성해 보겠습니다. 새 파일을 만들고 이름을 augmentation_demo.py로 지정합니다. 다음 코드를 삽입하십시오.

2-6 행은 필수 Python 패키지를 가져옵니다. Keras에서 ImageDataGenerator 클래스를 가져 오는 2 행을 기억해 두십시오.이 코드는 데이터 증가에 사용되며 입력 이미지를 변환하는 데 도움이되는 모든 관련 메서드를 포함합니다. 다음으로 명령 줄 인수를 구문 분석합니다.

스크립트에는 세 개의 명령 줄 인수가 필요합니다. 각 인수는 아래에 자세히 설명되어 있습니다.
• –image : 데이터 증가를 적용하고 결과를 시각화하려는 입력 이미지의 경로입니다.
• –output : 주어진 이미지에 데이터 증가를 적용한 후 검사 할 수 있도록 결과를 디스크에 저장하려고합니다.이 스위치는 출력 디렉토리를 제어합니다.
• –prefix : 출력 이미지 파일 이름 앞에 추가 할 문자열입니다.
이제 명령 줄 인수가 구문 분석되었으므로 입력 이미지를로드하고 Keras 호환 배열로 변환하고 이미지 분류를 위해 준비 할 때처럼 이미지에 차원을 추가합니다.

이제 ImageDataGenerator를 초기화 할 준비가되었습니다.

ImageDataGenerator 클래스에는 이 책에서 열거하기에는 너무 많은 매개 변수가 있습니다. 매개 변수에 대한 전체 검토는 공식 Keras 문서 (http://pyimg.co/j8ad8)를 참조하십시오.
대신 자체 애플리케이션에서 가장 많이 사용할 augmentation 매개 변수에 초점을 맞출 것입니다. rotation_range 매개 변수는 임의 회전의 각도 범위를 제어합니다. 여기에서 입력 이미지를 무작위로 ± 30도 회전 할 수 있습니다. width_shift_range 및 height_shift_range는 각각 수평 및 수직 이동에 사용됩니다. 매개 변수 값은 주어진 차원의 일부입니다 (이 경우 10 %).
shear_range는 이미지를 기울일 수있는 라디안으로 시계 반대 방향의 각도를 제어합니다. 그런 다음 [1-zoom_range, 1 + zoom_range] 값의 균일 한 분포에 따라 이미지를 “확대”또는 “축소”할 수있는 부동 소수점 값인 zoom_range가 있습니다.
마지막으로 horizontal_flip 부울은 주어진 입력이 훈련 과정에서 수평으로 뒤집힐 수 있는지 여부를 제어합니다. 대부분의 컴퓨터 비전 응용 프로그램의 경우 이미지의 수평 반전은 결과 클래스 레이블을 변경하지 않지만 수평 (또는 수직) 반전이 이미지의 의미를 변경하는 응용 프로그램이 있습니다.
우리의 목표는 입력 이미지를 약간 수정하여 클래스 레이블 자체를 변경하지 않고 새로운 학습 샘플을 생성하는 것이므로 이러한 유형의 데이터 증가를 적용 할 때는주의하십시오. ImageDataGenerator가 초기화되면 실제로 새로운 학습 예제를 생성 할 수 있습니다.

34 행과 35 행은 증강 이미지를 구성하는 데 사용되는 Python 생성기를 초기화합니다. 출력 이미지 파일 경로, 각 파일 경로의 접두사 및 이미지 파일 형식을 지정하는 몇 가지 추가 매개 변수와 함께 입력 이미지 인 batch_size 1을 전달합니다 (하나의 이미지 만 증가 시키므로). 그런 다음 38 행은 imageGen 생성기의 각 이미지를 반복하기 시작합니다. 내부적으로 imageGen은 루프를 통해 요청 될 때마다 새로운 학습 샘플을 자동으로 생성합니다. 그런 다음 디스크에 기록 된 총 데이터 증가 예제 수를 늘리고 예제 10 개에 도달하면 스크립트 실행을 중지합니다.
실제 데이터 증가를 시각화하기 위해 우리는 Jemma의 이미지 인 아래 그림(왼쪽)를 사용합니다. Jemma의 새로운 학습 예제 이미지를 생성하려면 다음 명령을 실행하십시오.
스크립트가 실행 된 후 출력 디렉토리에 10 개의 이미지가 표시되어야합니다.

왼쪽 : 데이터 augmentation을 적용 할 입력 이미지입니다.
오른쪽 : 데이터 augmentation 예제의 몽타주. 각 이미지가 어떻게 무작위로 회전하고, 기울이고, 확대되고, 수평으로 뒤집 혔는지 확인하십시오.
위 그림 (오른쪽)에서 시각화 할 수 있도록 각 이미지의 몽타주를 구성했습니다. 각 이미지가 어떻게 무작위로 회전하고, 기울이고, 확대되고, 수평으로 뒤집 혔는지 확인하십시오. 각각의 경우 이미지는 원래 클래스 레이블 dog 을 유지합니다. 그러나 각 이미지가 약간 수정되어 훈련 할 때 배울 수있는 새로운 패턴을 신경망에 제공합니다. 입력 이미지는 지속적으로 변경되기 때문에 (클래스 레이블은 동일하게 유지됨) 데이터 증가가없는 학습과 비교할 때 학습 정확도가 감소하는 것이 일반적입니다.
그러나이 장의 뒷부분에서 살펴 보 겠지만 데이터 확대는 과적합을 크게 줄이는 데 도움이 될 수 있으며, 동시에 모델이 새로운 입력 샘플에 더 잘 일반화되도록 보장합니다. 또한 딥러닝을 적용하기에는 예제가 너무 적은 데이터 세트로 작업 할 때 데이터 증강을 활용하여 추가 훈련 데이터를 생성 할 수 있으므로 딥 러닝 네트워크를 훈련하는 데 필요한 수동 레이블 데이터의 양을 줄일 수 있습니다.