이 장에서는 원시 이미지를 심층 신경망 훈련에 적합한 HDF5 데이터 세트로 직렬화하는 방법을 배웠습니다. 교육이 I/O 지연으로 인해 디스크에있는 이미지 경로의 미니 배치에 액세스하는 것이 아니라 원시 이미지를 HDF5 파일로 직렬화 한 이유는 I/O 지연 때문입니다 – 디스크의 각 이미지를 읽기 위해 I/O 작업을 수행해야 합니다.
이 미묘한 최적화는 큰 문제처럼 보이지 않지만 I/O 지연은 딥 러닝 파이프 라인에서 큰 문제입니다. 훈련 프로세스는 이미 충분히 느리고 네트워크가 데이터에 액세스하는 것을 어렵게 만들면 더욱 악화될 뿐입니다.
반대로 모든 이미지를 효율적으로 압축 된 HDF5 파일로 직렬화하면 매우 빠른 어레이 슬라이스를 활용하여 미니 배치를 추출 할 수 있으므로 I/O 지연 시간을 크게 줄이고 교육 프로세스 속도를 높일 수 있습니다.
Keras 라이브러리를 사용하고 메모리에 맞지 않는 너무 큰 데이터 세트로 작업 할 때마다 먼저 데이터 세트를 HDF5 형식으로 직렬화하는 것을 고려해야합니다. 다음 장에서 (더 효율적인) 작업을 확인할 수 있으므로 네트워크 훈련이 더 쉬워질 것입니다.
이 섹션은 NIPS 2016에서 Andrew Ng의 뛰어난 튜토리얼 인 Nuts and Bolts of Building Deep Learning Applications에서 인용된 것입니다. 이 강연에서 Ng는 자사 제품, 비즈니스 및 학술 연구에서 작동하는 딥 러닝 방법을 얻는 방법에 대해 논의했습니다. Ng의 강연에서 가장 중요한 내용은 다음과 같습니다
“적용된 딥 러닝에서 대부분의 문제는 훈련 데이터 / 테스트 데이터 불일치에서 비롯됩니다. 일부 시나리오에서는이 문제가 발생하지 않지만 적용된 머신 러닝 프로젝트가 대상 애플리케이션과 다른 학습 데이터 (수집 및 어노테이션)를 얼마나 자주 사용하는지 놀랄 것입니다. ” – Andrew Ng (Malisiewicz 요약)
Ng와 Malisiewicz가 여기에서 말하는 것은 훈련 데이터가 검증 및 테스트 세트를 대표하는지 확인하기 위해 극심한 주의를 기울여야한다는 것입니다. 예, 데이터 세트를 가져오고 주석을 달고 레이블을 지정하는 것은 시간이 많이 걸리고 경우에 따라 매우 비쌉니다. 그리고 딥러닝 방법은 특정 상황에서 잘 일반화되는 경향이 있습니다.
그러나 대표적이지 않은 데이터에 대해 학습 된 기계 학습 모델은 성공할 것으로 기대할 수 없습니다. 예를 들어, 우리가 도로를 주행 할 때 차량에 장착 된 카메라에서 차량의 제조사와 모델을 인식하는 딥러닝 시스템을 구축하는 임무를 맡고 있다고 가정합니다 (아래 그림, 왼쪽).

왼쪽 : 딥러닝을 사용하여 식별하려는 고속도로의 자동차
오른쪽 : 네트워크가 실제로 훈련 된 내용에 대한 “제품 샷”이미지의 예
첫 번째 단계는 훈련 데이터를 수집하는 것입니다. 데이터 수집 프로세스의 속도를 높이기 위해 우리는 자동차 사진과 자동차 제조사 및 모델이 모두 웹 페이지에 나열된 웹 사이트를 스크랩하기로 결정했습니다. 이러한 웹 사이트의 좋은 예에는 Autotrader.com, eBay, CarMax 등이 있습니다. 웹 사이트를 크롤링하고 개별 제품 목록 (즉, 차량 사양을 나열하는 “자동차 페이지”)을 찾은 다음 이미지를 다운로드하고 + 모델 정보를 만드는 간단한 스파이더를 구축 할 수 있습니다.
이 방법은 매우 간단하며 스파이더를 개발하는 데 걸리는 시간 외에는 상당히 큰 레이블이 지정된 데이터 세트를 축적하는 데 오래 걸리지 않습니다. 그런 다음이 데이터 세트를 훈련과 검증의 두 가지로 분할하고 주어진 딥러닝 아키텍처를 높은 정확도 (> 90 %)로 훈련합니다.
그러나 새로 훈련 된 모델을 위 그림(왼쪽)과 같이 예제 이미지에 적용하면 결과가 끔찍하다는 것을 알 수 있습니다. 실제 세계에 배포했을 때 5 %의 정확도를 얻을 수 있다는 것도 행운입니다. 왜 이럴까요?
그 이유는 우리가 쉬운 길을 택했기 때문입니다. 우리는 Autotrader, CarMax 및 eBay에 나열된 자동차의 제품 샷 (위 그림 오른쪽)이 우리의 딥러닝 비전 시스템이 자동차 대시 보드에 장착되어 보이는 차량을 대표하지 않는다는 점을 고려되어야 합니다. 우리의 딥러닝 시스템은 제품 샷에서 차량의 제조사와 모델을 식별하는 데 유용 할 수 있지만, 운전할 때 흔히 볼 수있는 것처럼 정면 또는 후면보기에서 자동차의 모델을 인식하지 못합니다.
자신만의 이미지 데이터 셋을 만드는 지름길은 없습니다. 딥러닝 시스템이 주어진 실제 상황에서 높은 정확도를 얻을 것으로 기대하는 경우이 딥 러닝 시스템이 배포 될 위치를 나타내는 이미지에 대해 교육되었는지 확인하십시오. 그렇지 않으면 성능에 매우 실망 할 것입니다.
해결하려는 분류 작업을 대표하는 충분한 교육 데이터를 수집했다고 가정하고 Andrew Ng는 교육에 도움이되는 4 단계 프로세스를 제공했습니다.

Andrew Ng의 강연의 슬라이드 13. 여기서 Ng는 딥 러닝 모델을 훈련 할 때 4 개의 개별 데이터 분할을 제안합니다.
위 그림을 기반으로 Ng는 딥러닝 모델을 훈련 할 때 네 가지 데이터 분할 세트를 제안하고 있음을 알 수 있습니다.
1. 훈련
2. 훈련 검증 (Ng는 “Dev”이라고 함)
3. 검증
4. 테스트
이전에 이미 훈련, 검증 및 테스트 분할을 보았습니다. 그러나 이 새로운 “훈련 검증”세트는 무엇일까요? Ng는 모든 데이터를 학습용으로 60 %, 테스트 용으로 나머지 40 %로 분할 할 것을 권장합니다. 그런 다음 테스트 데이터를 두 부분으로 나눕니다. 하나는 유효성 검사를위한 것이고 다른 하나는 실제 테스트를 위한 것입니다 (즉, 네트워크 성능을 평가할 준비가 될 때까지 결코 건드리지 않는 데이터). 훈련 세트에서 작은 덩어리를 가져 와서 “training-validation set”에 추가합니다. 훈련 세트는 모델의 편향을 결정하는 데 도움이되고 훈련-검증 세트는 분산을 결정하는 데 도움이 됩니다.

위 그림(왼쪽 상단)에서와 같이 훈련 오류가 너무 높으면 더 많은 계층과 뉴런을 추가하여 현재 아키텍처를 심화하는 것을 고려해야합니다. 또한 학습률을 조정하면서 동시에 더 긴 (즉, 더 많은 에포크) 훈련을 고려해야합니다. 더 작은 학습률을 사용하면 과적합을 방지하면서 더 오래 훈련 할 수 있습니다. 마지막으로, 현재 아키텍처를 사용하고 다양한 학습률을 사용하는 많은 실험이 유용하지 않다면 완전히 다른 모델 아키텍처를 시도해야 할 가능성이 높습니다.
순서도의 두 번째 항목으로 이동하여 훈련 검증 오류가 높으면 (위 그림, 오른쪽 상단) 네트워크에서 정규화 매개 변수를 조사해야합니다. 네트워크 아키텍처 내에 드롭 아웃 레이어를 적용하고 있습니까? 새로운 훈련 샘플을 생성하는 데 데이터 증강이 사용되고 있습니까? 실제 손실 / 업데이트 함수 자체는 어떻습니까? 정규화 패널티가 포함됩니까? 자신의 딥러닝 실험의 맥락에서 이러한 질문을 조사하고 정규화를 추가 하십시오.
또한 이 시점에서 더 많은 훈련 데이터를 수집하는 것도 고려해야합니다 (다시 말해서이 훈련 데이터가 모델이 배포 될 위치를 대표 한다는 점에 유의). 거의 모든 경우에 더 많은 훈련 데이터를 갖는 것은 결코 나쁜 일이 아닙니다. 모델에 예제 이미지의 기본 패턴을 학습하기에 충분한 학습 데이터가 없을 수 있습니다. 마지막으로 이러한 옵션을 모두 사용한 후 다시 한 번 다른 네트워크 아키텍처 사용을 고려하고 싶을 것입니다.
위 그림 (왼쪽 아래)의 순서도를 계속 살펴보면 훈련 검증 오류가 낮지 만 검증 세트 오류가 높으면 훈련 데이터를 더 자세히 살펴 봐야합니다. 훈련 이미지가 검증 이미지와 비슷하다는 것을 절대적으로 확실하게 확신합니까? 유효성 검사 또는 테스트 설정에서 보게 될 이미지를 대표하지 않는 이미지에 대해 학습 된 딥러닝 모델이 제대로 작동 할 것이라고 기대할 수 없습니다. 이것이 실제로 사실이라는 것을 깨달은 경우 데이터 세트 수집 단계로 돌아가 더 많은 데이터를 수집하는 데 시간을 할애하십시오. 딥 러닝 모델이 배포 될 위치를 나타내는 데이터가 없으면 높은 정확도의 결과를 얻을 수 없습니다. 또한 정규화 매개 변수를 다시 검사해야합니다. 정규화가 충분히 강합니까? 마지막으로 새로운 모델 아키텍처를 다시 고려해야 할 수도 있습니다.
마지막으로 순서도의 마지막 단계로 이동합니다. 테스트 오류가 높습니까? 이 시점에서 우리는 모델을 훈련 및 검증 데이터에 과적합 했습니다 (위 그림 오른쪽 하단). 이 과적합이 발생하기 시작하는 시기를 식별하는 데 도움이 되도록 돌아가서 유효성 검사 세트에 대한 더 많은 데이터를 수집해야합니다.
Andrew Ng가 제안한 이 방법론을 사용하면 실험이 예상한대로 나오지 않을 때 모델 / 데이터 세트 업데이트와 관련하여 더 쉽게 (올바른) 결정을 내릴 수 있습니다.