deepLearning Similar different Dataset small large python 머신러닝

다음 섹션은 Stanford의 cs231n 클래스의 우수한 “전이 학습”강의에서 영감을 받았습니다. 또한 실험에 도움이 되는 저만의 일화 경험을 포함했습니다. 특성 추출에 관한 23 장과 미세 조정에 관한 25 장의 전이 학습의 성공을 감안할 때 전이 학습을 적용해야 하는시기와 모델을 처음부터 학습해야하는 시기가 궁금 할 수 있습니다. 이 결정을 내리려면 두 가지 중요한 요소를 고려해야합니다.

1. 데이터 세트의 크기.

2. 사전 훈련된 CNN이 훈련에 사용한 데이터 세트(일반적으로 ImageNet)와 데이터 세트의 유사성.

이러한 요소를 기반으로 전이 학습을 적용해야하는지 아니면 처음부터 훈련해야하는지 여부를 결정하는 데 도움이되는 차트를 만들 수 있습니다 (아래 그림). 아래의 네 가지 가능성을 각각 검토해 보겠습니다.

네트워크를 처음부터 훈련해야 하는지 아니면 전이 학습에서 훈련해야하는지 결정하는 데 사용할 수 있는 표입니다.

Deep Learning Sandbox의 Greg Chu에서 인용함

데이터 세트가 작고 원본 데이터 세트와 유사합니다.

데이터 세트가 작기 때문에 처음부터 CNN을 학습 할 수있는 학습 예제가 충분하지 않을 수 있습니다 (다시 말하지만 인식을 원하는 클래스 당 1,000 ~ 5,000 개의 예제가 이상적으로 있어야 한다는 점을 기억하세요). 또한 학습 데이터가 부족하기 때문에 과적합 상태가 될 수 있으므로 미세 조정을 시도하는 것은 좋지 않습니다.

대신 이미지 데이터 세트가 사전 훈련 된 네트워크가 훈련 된 것과 유사하므로 네트워크를 특성 추출기로 취급하고 이러한 특성 위에 간단한 기계 학습 분류기를 훈련해야합니다. 이러한 기능은 더 풍부하고 원래 데이터 세트에서 학습 한 패턴을 대표하므로 아키텍처의 더 깊은 계층에서 기능을 추출해야합니다.

데이터 세트가 크고 원본 데이터 세트와 유사합니다.

데이터 세트가 큰 경우 과적합없이 미세 조정을 적용 할 수있는 충분한 예가 있어야합니다. 여기에서 자신의 모델을 처음부터 훈련시키고 싶을 수도 있습니다. 이 실험은 실행할 가치가 있습니다. 그러나 데이터 세트가 네트워크가 이미 훈련 된 원래 데이터 세트와 유사하기 때문에 네트워크 내부의 필터는 합리적인 분류기를 얻을 수있을 만큼 이미 차별적 일 수 있습니다. 따라서 이 경우 미세 조정을 적용하십시오.

데이터 세트가 작고 원본 데이터 세트와 다릅니다.

다시 한 번 작은 데이터 세트를 고려할 때 처음부터 학습하여 높은 정확도의 딥 러닝 모델을 얻지 못할 가능성이 높습니다. 대신 특성 추출을 다시 적용하고 그 위에 표준 머신 러닝 모델을 학습시켜야 합니다.하지만 데이터가 원래 데이터 세트와 다르기 때문에 네트워크에서 더 낮은 수준의 계층을 특성 추출기로 사용해야 합니다. 네트워크 아키텍처에 더 깊이 들어 갈수록 학습된 데이터 세트에 특화된 기능이 더 풍부하고 차별적이라는 점을 명심하십시오. 네트워크의 하위 계층에서 기능을 추출하여 이러한 필터를 계속 활용할 수 있지만 더 깊은 계층으로 인한 추상화는 이루어지지 않습니다.

새 데이터 세트가 크고 원본 데이터 세트와 다릅니다.

이 경우 두 가지 옵션이 있습니다. 훈련 데이터가 충분하기 때문에 자체 사용자 지정 네트워크를 처음부터 훈련시킬 수 있습니다. 그러나 ImageNet과 같은 데이터 세트에서 훈련 된 모델의 사전 훈련 된 가중치는 데이터 세트가 관련이 없더라도 우수한 초기화를 제공합니다. 따라서 두 세트의 실험을 수행해야합니다. 1. 첫 번째 실험 세트에서 사전 훈련 된 네트워크를 데이터 세트에 맞게 미세 조정하고 성능을 평가합니다.

2. 그런 다음 두 번째 실험 세트에서 새로운 모델을 처음부터 훈련시키고 평가합니다.

정확히 어떤 방법이 가장 잘 수행되는지는 전적으로 데이터 세트 및 분류 문제에 따라 다릅니다. 그러나 이 방법을 사용하면 두 번째 실험 세트로 이동하고 네트워크를 처음부터 훈련 할 때 이길 기준을 설정할 수 있으므로 먼저 미세 조정을 시도하는 것이 좋습니다.

이 장에서는 사용자 지정 네트워크를 훈련 할 때 딥 러닝 기술을 적용하는 최적의 경로를 탐색했습니다. 훈련 데이터를 수집 할 때 지름길이 없다는 점을 염두에 두십시오. 모델을 훈련하는 데 사용하는 데이터가 실제 애플리케이션에 배포 될 때 네트워크가 보게 될 이미지를 나타내는 지 확인하십시오.

“Garbage in, garbage out”이라는 오래된 일화가 있습니다. 입력 데이터가 학습 후 모델이 보게 될 데이터 포인트의 예를 나타내지 않는 경우 기본적으로 이 쓰레기통에 빠지게됩니다. 그렇다고 데이터가 “쓰레기”라는 것은 아닙니다. 대신 자신의 실험을 수행 할 때 이 일화를 기억하고 처음에 인식하도록 훈련되지 않은 데이터 포인트에서 딥러닝 모델이 잘 수행 될 수 없다는 사실을 깨달으십시오. 또한 전이 학습과 자신의 네트워크를 처음부터 훈련해야 하는 시기를 검토했습니다. 작은 데이터 세트의 경우 특징 추출을 고려해야합니다. 더 큰 데이터 세트의 경우 먼저 미세 조정 (기준선 설정)을 고려한 다음 처음부터 모델 학습으로 이동합니다

딥러닝 deepLearning 최적화 머신러닝 파이썬 python dogs and cats

이 장에서는 원시 이미지를 심층 신경망 훈련에 적합한 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가 제안한 이 방법론을 사용하면 실험이 예상한대로 나오지 않을 때 모델 / 데이터 세트 업데이트와 관련하여 더 쉽게 (올바른) 결정을 내릴 수 있습니다.

Dataset Building Dataset Building HDF5 Dataset Writer 인공지능 딥러닝

이제 구성 파일이 정의되었으므로 실제로 HDF5 데이터 세트를 빌드 해 보겠습니다. 새 파일을 열고 이름을 build_dogs_vs_cats.py로 지정하고 다음 코드를 삽입합니다.

2-12 행은 필수 Python 패키지를 가져옵니다. 프로젝트의 첫 번째 가져 오기로 프로젝트 구성 파일을 가져오고 싶습니다 (2 행). 이 방법은 취향의 문제이므로 파일에서 원하는 위치에 가져 오기를 자유롭게 배치하십시오. 또한 dogs_vs_cats_config의 이름을 단순히 config로 변경하여 코드를 작성할 때 덜 장황하게 만듭니다.

다음은 이전 장에서 보았던 import 입니다. 그러나 23 장에서 정의한 것과 동일한 HDF5DatasetWriter 인 6 행의 HDF5DatasetWriter에 주의를 기울이고 싶습니다.이 클래스는 디스크의 원시 이미지를 단일 직렬 파일로 압축하는 데 사용됩니다.

또한 주어진 작업에 걸리는 대략적인 시간을 측정 할 때 사용하는 간단한 유틸리티 라이브러리 인 progressbar 모듈을 다시 사용할 것입니다. 이 모듈은 딥러닝과는 전혀 관련이 없지만 대용량 데이터 세트의 경우 이미지 데이터 세트를 HDF5 형식으로 압축하는 데 몇 시간이 걸릴 수 있으므로 사용하는 것이 편리합니다.

다음으로 Kaggle Dogs vs. Cats 데이터 세트의 이미지 경로를 살펴 보겠습니다.

Dogs vs. Cats 데이터 세트에는 다음 예제 디렉토리 구조가 있습니다.

클래스 이름이 실제 파일 이름에 어떻게 내장되어 있는지 확인하십시오. 따라서 파일 경로의 파일 구성 요소, 구분 기호를 입력하고 클래스 이름을 추출합니다. 실제로 16 행과 17 행이 수행하는 일입니다. 데이터 세트의 모든 이미지에 대한 경로가 주어지면 이미지를 개별적으로 반복하고 파일 경로에서 라벨을 추출합니다.

이러한 코드 줄이 혼란스러우면 지금 수동으로 코드, 특히 os.path.sep 변수와 파일 경로 문자열에 사용 된 .split 함수를 사용하여 이러한 유틸리티가 어떻게 사용되는지 자세히 알아 보는 것이 좋습니다. 파일 경로를 조작합니다.

그런 다음 18 행과 19 행은 클래스 레이블을 인코딩합니다. Kaggle Dogs vs. Cats 프로젝트의 경우 훈련 분할, 유효성 검사 분할, 테스트 분할의 세 분할이 필요합니다. 다음 코드 블록은 이러한 각 분할 생성을 처리합니다.

23-26 행에서 입력 이미지와 레이블을 가져 와서 훈련 및 테스트 분할을 구성하는 데 사용합니다. 그러나 검증 세트를 생성하려면 30-33 행에서 또 다른 분할을 수행해야합니다. 검증 세트는 (거의 항상) 훈련 데이터에서 가져옵니다. 테스트 및 유효성 검사 분할의 크기는 NUM_TEST_IMAGES 및 NUM_VAL_IMAGES를 통해 제어되며, 각각은 구성 파일에 정의되어 있습니다.

이제 학습, 테스트 및 유효성 검사 분할이 있으므로이를 반복하고 각 데이터 세트의 이미지를 HDF5 파일에 효율적으로 쓸 수있는 간단한 목록을 만들어 보겠습니다.

38 행에서 훈련, 검증 및 테스트 변수를 포함하는 데이터 세트 목록을 정의합니다. 목록의 각 항목은 다음으로 구성된 4- 튜플입니다.

1. 스플릿 이름 (예 : 교육, 테스트 또는 유효성 검사).

2. 분할에 대한 각각의 이미지 경로.

3. 분할의 레이블.

4. 분할을위한 출력 HDF5 파일의 경로.

그런 다음 45 행에서 AspectAwarePreprocessor를 초기화하여 HDF5에 기록하기 전에 이미지의 크기를 256x 256 픽셀로 조정합니다 (이미지의 종횡비를 염두에 두어야 함). 각 채널의 평균 픽셀 강도를 저장하는 데 사용되는 46 행 R, G, B의 세 목록도 초기화합니다. 마지막으로 HDF5 데이터 세트를 구축 할 준비가 되었습니다.

49 행에서 데이터 세트 목록의 각 4- 튜플 값을 반복하기 시작합니다. 각 데이터 분할에 대해 HDF5DatasetWriter를 52행에 인스턴스화합니다. 여기서 출력 데이터 세트의 크기는 (len (paths), 256, 256, 3)이며, 이는 len (paths) 만큼 총 이미지가 있음을 의미합니다. 너비는 256 픽셀, 높이는 256 픽셀, 채널 3 개입니다.

54-58 행은 데이터 셋 생성 과정을 쉽게 모니터링 할 수 있도록 진행률 표시 줄을 초기화합니다. 다시 말하지만,이 코드 블록 (나머지 진행률 표시 줄 함수 호출과 함께)은 전적으로 선택 사항이므로 원하는 경우 주석 처리 할 수 ​​있습니다. 다음으로 지정된 데이터 분할의 각 이미지를 writer로 기록해 보겠습니다.

61 행에서 데이터 분할의 각 개별 이미지와 해당 클래스 레이블을 반복하기 시작합니다. 63 행과 64 행은 디스크에서 이미지를 로드 한 다음 aspect-aware preprocessor를 적용하여 이미지 크기를 256×256 픽셀로 조정합니다.

train 데이터 분할을 검토하고 있는지 확인하기 위해 69 행을 확인하고, 그렇다면 Red, Green, Blue 채널 (70행)의 평균을 계산하고 71-73 번 라인의 각 목록을 업데이트합니다. RGB 채널의 평균 계산은 훈련 세트에 대해서만 수행되며 평균 빼기 정규화를 적용하려는 경우 필수 사항입니다.

76 행은 해당 이미지와 레이블을 HDF5DatasetWriter에 추가합니다. 데이터 분할의 모든 이미지가 HDF5 데이터 세트로 직렬화되면 81 행에서 writer를 닫습니다. 마지막 단계는 RGB 평균을 디스크에 직렬화하는 것입니다.

86 행은 훈련 세트의 모든 이미지에 대한 평균 RGB 값의 Python dictionary를 구성합니다. 각 개별 R, G, B에는 데이터 세트의 각 이미지에 대한 평균 채널이 포함되어 있습니다. 이 목록의 평균을 계산하면 목록의 모든 이미지에 대한 평균 픽셀 강도 값이 제공됩니다. 이 dictionary는 87-88 행에서 JSON 형식으로 디스크에 직렬화됩니다.

계속해서 Kaggle Dogs vs. Cats 데이터 세트를 HDF5 형식으로 직렬화하겠습니다. 터미널을 열고 다음 명령을 실행하십시오.

출력에서 ​​볼 수 있듯이 각 훈련, 테스트 및 검증 분할에 대해 HDF5 파일이 생성되었습니다. 이 분할에는 가장 많은 데이터 (2m39s)가 포함되어 있으므로 훈련 분할 생성에 가장 오래 걸렸습니다. 테스트 및 유효성 검사 분할은 이러한 분할에 데이터가 더 적기 때문에 훨씬 더 적은 시간 (≈ 20 초)이 소요되었습니다. hdf5 디렉토리의 내용을 나열하여 디스크에서 이러한 각 출력 파일을 볼 수 있습니다

이러한 파일 크기를 보면 약간 놀랄 수 있습니다. 디스크에있는 원시 Kaggle Dogs vs. Cats 이미지는 595MB에 불과합니다. .hdf5 파일이 왜 그렇게 큰가요? train.hdf5 파일 만 31.45GB이고 test.hdf5 및 val.hdf5 파일은 거의 4GB입니다. 왜 그럴까요?

JPEG 및 PNG와 같은 원시 이미지 파일 형식은 데이터 압축 알고리즘을 적용하여 이미지 파일 크기를 작게 유지합니다. 그러나 우리는 모든 유형의 압축을 효과적으로 제거했으며 이미지를 원시 NumPy 배열 (즉, 비트 맵)로 저장하고 있습니다. 이러한 압축 부족으로 인해 스토리지 비용이 크게 증가하지만 이미지를 디코딩하는 데 프로세서 시간을 낭비 할 필요가 없기 때문에 교육 시간을 단축하는 데 도움이됩니다. 대신 HDF5 데이터 세트에서 직접 이미지에 액세스하고 이를 전처리 한 다음 전달할 수 있습니다. 우리 네트워크를 통해. RGB 평균 파일도 살펴 보겠습니다.

여기에서 빨간색 채널의 평균 픽셀 강도는 데이터 세트의 모든 이미지에서 124.96임을 알 수 있습니다. 파란색 채널의 평균은 106.13이고 녹색 채널은 평균 115.97입니다. 네트워크를 통과하기 전에 입력 이미지에서 이러한 RGB 평균값을 빼서 이미지를 정규화하는 새로운 이미지 전처리기를 구성 할 것입니다. 이는 정규화를 통해 데이터를 제로 평균을 중심으로 “중심화”할 수 있습니다. 일반적으로이 정규화를 통해 우리의 네트워크는 더 빨리 학습 할 수 있으며 더 크고 까다로운 데이터 세트에서 이러한 유형의 정규화 ([0,1] 스케일링 대신)를 사용합니다.

이 장에서는 원시 이미지를 심층 신경망 훈련에 적합한 HDF5 데이터 세트로 직렬화하는 방법을 배웠습니다. 교육이 I/O 지연으로 인해 디스크에있는 이미지 경로의 미니 배치에 액세스하는 것이 아니라 원시 이미지를 HDF5 파일로 직렬화 한 이유는 I/O 지연 때문입니다 – 디스크의 각 이미지를 읽기 위해 I/O 작업을 수행해야 합니다.

이 미묘한 최적화는 큰 문제처럼 보이지 않지만 I/O 지연은 딥 러닝 파이프 라인에서 큰 문제입니다. 훈련 프로세스는 이미 충분히 느리고 네트워크가 데이터에 액세스하는 것을 어렵게 만들면 더욱 악화될 뿐입니다.

반대로 모든 이미지를 효율적으로 압축 된 HDF5 파일로 직렬화하면 매우 빠른 어레이 슬라이스를 활용하여 미니 배치를 추출 할 수 있으므로 I/O 지연 시간을 크게 줄이고 교육 프로세스 속도를 높일 수 있습니다.

Keras 라이브러리를 사용하고 메모리에 맞지 않는 너무 큰 데이터 세트로 작업 할 때마다 먼저 데이터 세트를 HDF5 형식으로 직렬화하는 것을 고려해야합니다. 다음 장에서 (더 효율적인) 작업을 확인할 수 있으므로 네트워크 훈련이 더 쉬워질 것입니다.

인공지능 configuration 딥러닝 기계학습 AI HDF5 datasets kaggle Dogs vs. Cats

이제 더 고급 프로젝트와 딥 러닝 방법을 빌드하기 시작 했으므로 각 프로젝트에 대한 특수 구성 Python 모듈을 만들고 싶습니다. 예를 들어, 다음은 Kaggle Dogs vs. Cats 프로젝트의 디렉토리 구조입니다.

다음 장에서 검토 할 예정이므로 지금은 실제 Python 스크립트를 무시할 수 있지만 config라는 디렉토리를 살펴보십시오. 구성 내부에는 dogs_vs_cats_config.py라는 단일 Python 파일이 있습니다.이 파일을 사용하여 다음을 포함하여 프로젝트의 모든 관련 구성을 저장합니다.

1. 입력 이미지에 대한 경로.

2. 총 클래스 레이블 수.

3. 교육, 검증 및 테스트 분할에 대한 정보.

4. HDF5 데이터 세트의 경로.

5. 출력 모델, 플롯, 로그 등에 대한 경로.

JSON 파일이 아닌 Python 파일을 사용하면 Python 코드 스니펫을 포함 할 수 있고 구성 파일을보다 효율적으로 작업 할 수 있습니다 (좋은 예는 다음을 사용하여 파일 경로를 조작하는 것입니다. os.path 모듈). 생산성을 크게 향상시키고 단일 파일을 통해 프로젝트의 대부분의 매개 변수를 제어 할 수 있으므로 자신의 딥 러닝 프로젝트에 Python 기반 구성 파일을 사용하는 습관을 들일 것을 제안합니다.

29.2.1 첫번째 Configuration 파일

계속해서 Kaggle Dogs vs. Cats 데이터 세트에 대한 구성 파일 (dogs_vs_cats_config.py)을 살펴 보겠습니다.

2 행에서는 개와 고양이 이미지가 포함 된 디렉토리 경로를 정의합니다. 이 이미지는 이 장의 뒷부분에서 HDF5 데이터 세트로 압축 할 이미지입니다. 7-9 행은 유효성 검사 및 테스트 이미지 수 (각각 2,500 개)와 함께 총 클래스 레이블 수 (2 개 : 개, 고양이)를 정의합니다. 그런 다음 13-15 행에서 각각 훈련, 검증 및 테스트 분할을 위해 출력 HDF5 파일의 경로를 지정할 수 있습니다.

구성 파일의 후반부는 출력 직렬화 된 가중치에 대한 경로, 데이터 세트 평균 및 플롯, 분류 보고서, 로그 등을 저장하기 위한 일반 “출력”경로를 정의합니다.#

DATASET_MEAN 파일은 전체 (훈련) 데이터 세트에 걸쳐 평균 빨강, 녹색 및 파랑 픽셀 강도 값을 저장하는 데 사용됩니다. 네트워크를 훈련시킬 때 이미지의 모든 픽셀에서 평균 RGB 값을 뺍니다 (테스트 및 평가에도 동일하게 적용됨). 평균 빼기 라고하는 이 방법은 데이터 정규화 기술의 한 유형이며 픽셀 강도를 [0,1] 범위로 조정하는 것보다 더 자주 사용됩니다. 이는 대규모 데이터 세트와 심층 신경망에서 더 효과적인 것으로 나타났습니다.

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

지금까지이 책에서 우리는 기계의 주 메모리에 맞을 수있는 데이터 세트로만 작업했습니다. 소규모 데이터 세트의 경우 이는 합리적인 가정입니다. 각 개별 이미지를 로드하고 전처리 한 다음 네트워크를 통해 공급되도록 허용하기 만하면됩니다. 그러나 대규모 딥러닝 데이터 세트 (예 : ImageNet)의 경우 한 번에 데이터 세트의 일부 (예 : 미니 배치)에만 액세스하는 데이터 생성기를 생성 한 다음 배치가 네트워크를 통해 전달되도록 허용해야합니다.

운 좋게도 Keras에는 디스크의 원시 파일 경로를 교육 프로세스에 대한 입력으로 사용할 수있는 메서드가 포함되어 있습니다. 전체 데이터 세트를 메모리에 저장할 필요가 없습니다. Keras 데이터 생성기에 이미지 경로를 제공하기 만하면 이미지가 일괄 적으로 로드되고 네트워크를 통해 공급됩니다.

그러나 이 방법은 매우 비효율적입니다. 디스크에있는 모든 이미지에는 학습 파이프 라인에 지연 시간이 존재하는 I/O 작업이 필요합니다. 딥러닝 네트워크를 훈련하는 것은 이미 충분히 느립니다. I/O 병목 현상을 최대한 피하는 것이 좋습니다.

더 우아한 솔루션은 전이 학습 및 특징 추출에 관한 23 장에서 했던 것처럼 원시 이미지에 대한 HDF5 데이터 세트를 생성하는 것입니다. 이번에는 추출된 특징이 아닌 이미지 자체를 저장합니다. HDF5는 방대한 데이터 세트를 저장할 수있을 뿐만 아니라 I/O 작업, 특히 파일에서 일괄 추출 ( “슬라이스”라고 함)을 추출하는 데 최적화되어 있습니다. 이 책의 나머지 부분에서 볼 수 있듯이 디스크에있는 원시 이미지를 HDF5 파일로 압축하는 추가 단계를 수행하면 데이터 세트를 빠르게 구축하고 딥 러닝 네트워크를 훈련시키는 데 사용할 수있는 딥 러닝 프레임 워크를 구축 할 수 있습니다.

이 장의 나머지 부분에서는 Kaggle Dogs vs. Cats competition을 위해 HDF5 데이터 세트를 구성하는 방법을 보여줄 것입니다. 그런 다음 다음 장에서는이 HDF5 데이터 세트를 사용하여 중요한 AlexNet 아키텍처를 훈련시켜 다음 장에서 순위표에서 top-25에 이르게 되는 것을 볼 수 있습니다.

Kaggle : Dogs vs. Cats 데이터 세트를 다운로드하려면 먼저 kaggle.com에서 계정을 만들어야 합니다.

Dogs vs. Cats 홈페이지 (https://www.kaggle.com/c/dogs-vs-cats/data)로 이동합니다.

train.zip을 다운로드해야합니다. test1.zip을 다운로드하지 마십시오. test1.zip 내의 이미지는 예측을 계산하고 Kaggle 평가 서버에 제출하는 데만 사용됩니다. 자체 학습 및 테스트 분할을 구성하려면 클래스 레이블이 필요하므로 train.zip 만 필요합니다. 자신의 예측 결과를 제출하는 것은 범위를 벗어나지 만 sampleSubmission.csv에 설명된 파일 형식에 따라 test1.zip에 예측을 작성하면 쉽게 수행 할 수 있습니다.

train.zip을 다운로드 한 후 압축을 해제하면 train이라는 디렉토리가 있습니다. 이 디렉토리에는 실제 이미지가 포함되어 있습니다. 레이블 자체는 파일 이름 검사에서 파생 될 수 있습니다. 아래에 파일 이름 샘플을 포함했습니다.

이 프로젝트에 다음 데이터 구조를 사용합니다.

Kaggle : Dogs vs. Cats 대회 전용 폴더에 예제 이미지가 포함 된 train 디렉토리를 저장하는 방법에 주목하십시오. 여기에서 이 프로젝트의 코드를 저장할 dogs_vs_cats 디렉토리가 있습니다. 이제 Dogs vs. Cats 데이터 세트를 다운로드하고 디렉토리 구조를 검토 했으므로 configuration 파일을 만들어 보겠습니다.

Logistic Regression 분류기 training deepLearning python 기계학습 케글 dogs Cats HDF5 kaggle

로지스틱 회귀 분류기를 훈련하려면 새 파일을 열고 이름을 train_model.py로 지정하십시오.

2-8 행은 필수 Python 패키지를 가져옵니다. 그런 다음 명령 줄 인수를 구문 분석합니다.

여기에는 훈련이 완료된 후 출력 로지스틱 회귀 모델에 대한 경로와 함께 입력 HDF5 –db에 대한 경로 인 두 개의 스위치 만 필요합니다. 다음으로 읽기용 HDF5 데이터 세트를 열고 학습용 데이터의 75 %, 테스트 용 데이터의 25 % 인 학습 및 테스트 분할을 결정합니다.

이 기능 분할이 주어지면 LogisticRegression 분류기의 C 하이퍼 파라미터에 대한 그리드 서치를 수행합니다.

C의 최선의 선택을 찾으면 테스트 세트에 대한 분류 보고서를 생성 할 수 있습니다.

마지막으로, 훈련 된 모델은 나중에 사용할 수 있도록 디스크에 직렬화 할 수 있습니다.

ResNet50 기능에 대한 모델을 학습하려면 다음 명령을 실행하면됩니다.

결과에서 볼 수 있듯이 특징 추출을 통한 전이 학습을 사용하는 우리의 접근 방식은 98.69 %의 인상적인 정확도를 산출하여 Kaggle Dogs vs. Cats 순위표에서 2 위 자리를 차지하기에 충분합니다.

이 장에서 우리는 Kaggle Dogs vs. Cats 데이터 세트에 대해 자세히 살펴보고 다음과 같이 90 % 이상의 분류 정확도를 얻는 방법을 연구했습니다.

1. AlexNet을 처음부터 훈련합니다.

2. ResNet을 통한 전이 학습 적용.

AlexNet 아키텍처는 2012년 Krizhevsky 등이 처음 소개 한 작업입니다. AlexNet 구현을 사용하여 분류 정확도가 94 %에 도달했습니다. 이것은 특히 처음부터 훈련 된 네트워크의 경우 매우 존경할만한 정확성입니다. 추가 정확도는 다음을 통해 얻을 수 있습니다.

1. 더 많은 훈련 데이터 얻기.

2.보다 적극적인 데이터 증대를 적용합니다.

3. 네트워크 심화.

그러나 우리가 얻은 94 %는 상위 5 위는 말할 것도없고 상위 25 위 리더 보드에 진입하기에 충분하지 않습니다. 따라서 상위 5 위 위치를 얻기 위해 특성 추출을 통한 전이 학습, 특히 ImageNet 데이터 세트에서 훈련 된 ResNet50 아키텍처에 의존했습니다. ImageNet에는 개와 고양이 품종의 많은 예가 포함되어 있으므로 사전 훈련 된 네트워크를 이 작업에 적용하는 것은 더 적은 노력으로 더 높은 정확도를 얻을 수있는 자연스럽고 쉬운 방법입니다.

결과에서 알 수 있듯이 분류 정확도는 98.69 %로 Kaggle Dogs vs. Cats 순위표에서 2 위를 차지할 수있을만큼 높습니다.

Kaggle Dogs top5 acquire python machineLearning Augmentation 딥러닝

물론 Kaggle Dogs vs. Cats 순위표를 살펴보면 상위 25 위 순위에 진입하려면 96.69 %의 정확도가 필요하지만 현재 방법으로는 도달 할 수 없습니다. 그렇다면 해결책은 무엇입니까?

대답은 전이 학습, 특히 특징 추출을 통한 전이 학습입니다. ImageNet 데이터 세트는 1,000 개의 개체 범주로 구성되어 있지만 그중 상당 부분에는 개 종과 고양이 종이 포함됩니다. 따라서 ImageNet에서 훈련 된 네트워크는 이미지가 개인 지 고양이인지뿐만 아니라 동물의 특정 품종도 알려줄 수 있습니다. ImageNet에서 훈련 된 네트워크가 이러한 세분화 된 동물을 구별 할 수 있어야한다는 점을 감안할 때, 사전 훈련 된 네트워크에서 추출한 기능이 Kaggle Dogs vs. Cats에서 최고의 자리를 차지할 가능성이 높다고 가정하는 것은 당연합니다.

이 가설을 테스트하기 위해 먼저 사전 훈련 된 ResNet 아키텍처에서 특성을 추출한 다음 이러한 특성 위에 로지스틱 회귀 분류기를 훈련시켜 보겠습니다.

30.6.1 ResNet을 이용한 피처 추출

이 섹션에서 사용할 특징 추출 기술을 통한 전이 학습은 30 장을 기반으로합니다. 전체적인 문제로 extract_features.py의 전체 내용을 검토하겠습니다. 그러나 CNN을 사용한 특징 추출에 대한 추가 지식이 필요한 경우 30 장을 참조하십시오. 시작하려면 새 파일을 열고 이름을 extract_features.py로 지정한 후 다음 코드를 삽입하십시오.

2 ~ 13 행은 필수 Python 패키지를 가져옵니다. 사전 학습 된 ResNet 아키텍처에 액세스 할 수 있도록 2 행에서 ResNet50 클래스를 가져옵니다. 또한 7 행에서 HDF5DatasetWriter를 사용하여 추출 된 기능을 효율적으로 HDF5 파일 형식으로 작성할 수 있습니다. 여기에서 명령 줄 인수를 구문 분석해 보겠습니다

여기에는 두 개의 필수 명령 줄 인수 인 –dataset 만 필요합니다.이 인수는 Dogs vs. Cats 이미지의 입력 데이터 세트 경로이고, –output은 ResNet을 통해 추출 된 기능을 포함하는 출력 HDF5 파일 경로입니다. 다음으로 디스크에있는 Dogs vs. Cats 이미지의 경로를 가져온 다음 파일 경로를 사용하여 레이블 이름을 추출해 보겠습니다.

이제 디스크에서 사전 훈련 된 ResNet50 가중치를 로드 할 수 있습니다 (FC 레이어 제외).#

ResNet50에서 추출한 기능을 디스크에 저장하려면 HDF5DatasetWriter 객체를 인스턴스화 해야합니다.

ResNet50의 최종 평균 풀링 레이어는 100352 (224 x 224 x 2 = 100352) 이므로 HDF5datasetWriter에 차원으로 100352 값을 제공합니다. 또한 기능 추출 프로세스를 추적 할 수 있도록 진행률 표시 줄을 초기화합니다.

CNN을 사용하여 데이터 세트에서 특징을 추출하는 것은 30 장에서와 동일합니다. 먼저, 일괄적으로 imagePath를 반복합니다

이어서 각 이미지를 사전 처리합니다.

그런 다음 네트워크 아키텍처를 통해 batchImage를 전달하여 ResNet50의 최종 POOL 계층에서 기능을 추출 할 수 있습니다.

이렇게 추출 된 피처는 데이터 세트에 추가 합니다.

ResNet을 활용하여 Dogs vs. Cats 데이터 세트에서 특징을 추출하려면 다음 명령을 실행하면됩니다.

명령 실행이 완료되면 이제 출력 디렉토리에 dogs_vs_cats_features.hdf5라는 파일이 있어야합니다.

이러한 기능이 주어지면 그 위에 로지스틱 회귀 분류기를 훈련하여 Kaggle Dogs vs. Cats 리더 보드에서 top-5위 자리를 얻을 수 있습니다.

AlexNet definition 인공지능 #딥러닝 #기계학습 AI DeepLearning HDF5 python

이제 Krizhevsky et al.의 중요한 AlexNet 아키텍처를 구현해 보겠습니다. AlexNet 아키텍처를 요약 한 표는 아래 표에서 볼 수 있습니다.

AlexNet 아키텍처의 표 요약입니다. 출력 볼륨 크기는 관련되는 경우 컨볼 루션 필터 크기 / 풀 크기와 함께 각 레이어에 포함됩니다.

입력 이미지가 227 × 227 × 3 픽셀로 가정되는 방식에 주목하십시오. 이것은 실제로 AlexNet의 올바른 입력 크기입니다. 29 장에서 언급했듯이, 원래 출판물에서 Krizhevsky et al. 입력 공간 크기가 224x224x3이라고 보고했습니다. 그러나 11×1 커널로 타일링하면 224×224가 불가능하다는 것을 알기 때문에 출판물에 오타가있을 가능성이 있으며 224×224는 실제로 227×227이어야합니다.

AlexNet의 첫 번째 블록은 stride가 4×4 인 96, 11×11 커널을 적용한 다음 풀 크기가 3×3이고 stride가 2×2 인 RELU 활성화 및 최대 풀링을 적용하여 57 × 57 크기의 출력 볼륨을 생성합니다.

그런 다음 두 번째 CONV => RELU => POOL 레이어를 적용합니다. 이번에는 1×1 스트라이드의 256, 5×5 필터를 사용합니다. 풀 크기가 3×3이고 보폭이 2×2 인 최대 풀링을 다시 적용하면 13×13 볼륨이 남습니다.

다음으로 (CONV => RELU) * 3 => POOL을 적용합니다. 처음 두 개의 CONV 레이어는 384, 3×3 필터를 학습하고 최종 CONV는 256, 3×3 필터를 학습합니다.

또 다른 최대 풀링 작업 후에는 각각 4096 개의 노드와 RELU 활성화가있는 두 개의 FC 계층에 도달합니다. 네트워크의 마지막 계층은 소프트 맥스 분류기입니다. AlexNet이 처음 도입되었을 때 배치 정규화와 같은 기술이 없었습니다. 구현시 Convolutional Neural Networks를 사용하는 대부분의 이미지 분류 작업에 대한 표준과 같이 활성화 후 배치 정규화를 포함 할 것입니다. 또한 과적 합을 줄이기 위해 각 POOL 작업 후 매우 적은 양의 드롭 아웃을 포함 할 것입니다. AlexNet을 구현하기 위해 pyimagesearch에서 nn의 conv 하위 모듈에 alexnet.py라는 새 파일을 생성하겠습니다.

여기에서 alexnet.py를 열고 다음과 같은 중요한 아키텍처를 구현할 것입니다

2-11 행은 필수 Keras 클래스를 가져옵니다. 이전에 이 책의 이전 장에서 이러한 모든 레이어를 사용했으므로 각 레이어에 대해 명시 적으로 설명하지 않겠습니다. 제가 주목하고 싶은 유일한 import l2 함수를 가져 오는 10행 입니다.이 방법은 L2 가중치 감쇄를 네트워크의 가중치 레이어에 적용하는 역할을 합니다. import가 처리되었으므로 AlexNet의 정의를 시작하겠습니다.

15 행은 AlexNet의 빌드 방법을 정의합니다. 이 책의 모든 이전 예제와 마찬가지로 실제 네트워크 아키텍처를 구성하고이를 호출 함수로 반환하려면 build 메서드가 필요합니다. 이 메서드는 입력 이미지의 너비, 높이, 깊이와 데이터 세트의 총 클래스 레이블 수의 네 가지 인수를받습니다. 선택적 매개 변수 인 reg는 네트워크에 적용 할 L2 정규화의 양을 제어합니다. 더 크고 심층적 인 네트워크의 경우 정규화를 적용하는 것은 유효성 검사 및 테스트 세트의 정확도를 높이면서 과적합을 줄이는 데 중요합니다.

18 행은 “channels last”순서를 사용한다고 가정하고 inputShape 및 채널 차원과 함께 모델 자체를 초기화합니다. 대신 “channels first”순서를 사용하는 경우 inputShape 및 chanDim을 업데이트합니다 (24 ~ 26 행).

이제 네트워크에 설정된 첫 번째 CONV => RELU => POOL 레이어를 정의하겠습니다.

첫 번째 CONV 레이어는 4×4의 보폭을 사용하여 크기가 11×11 (28 및 29행) 인 96 개의 필터를 학습합니다. kernel_regularizer 매개 변수를 Conv2D 클래스에 적용하면 L2 가중치 정규화 매개 변수를 적용 할 수 있습니다. 이 정규화는 네트워크의 모든 CONV 및 FC 계층에 적용됩니다.

CONV 후에 ReLU 활성화가 적용되고 BatchNormalization (32 및 33 행)이 이어집니다. MaxPooling2D는 공간 차원을 줄이기 위해 적용됩니다 (34 행). 또한 과적 합을 줄이기 위해 작은 확률 (25 %)로 드롭 아웃을 적용 할 것입니다 (35 행). 다음 코드 블록은 또 다른 CONV => RELU => POOL 계층 집합을 정의하며 이번에는 크기가 각각 5×5 인 256 개의 필터를 학습합니다.

POOL 작업을 적용하기 전에 여러 CONV => RELU를 함께 스택하는 AlexNet의 세 번째 블록에서 더 깊고 풍부한 기능을 학습합니다.

처음 두 개의 CONV 필터는 384, 3×3 필터를 학습하고 세 번째 CONV는 256, 3×3 필터를 학습합니다. 다시 말하지만, 파괴적인 POOL 레이어를 적용하기 전에 여러 CONV => RELU 레이어를 쌓아두면 네트워크가 더 풍부하고 잠재적으로 더 차별적 인 기능을 배울 수 있습니다.

거기에서 우리는 완전히 연결된 2 개의 레이어 (각각 4096 노드)를 사용하여 다차원 표현을 표준 피드 포워드 네트워크로 축소합니다.

배치 정규화는 위의 CONV 계층에서와 같이 FC 계층 집합에서 각 활성화 후에 적용됩니다. 대부분의 CNN에서 표준처럼 모든 FC 레이어 세트 이후에 50 %의 더 큰 확률로 드롭 아웃이 적용됩니다. 마지막으로 원하는 클래스 수를 사용하여 소프트 맥스 분류기를 정의하고 결과 모델을 호출 함수로 반환합니다.

보시다시피 AlexNet 구현은 특히 위의 표에 제시된 아키텍처를 보면 매우 간단한 프로세스입니다. 간행물에서 아키텍처를 구현할 때마다 구현이 훨씬 쉬워지는 표를 확인하세요. 자체 네트워크 아키텍처의 경우 네트워크 아키텍처 시각화에 대한 20 장을 내용을 고려하여 입력 볼륨 및 출력 볼륨 크기가 예상 한대로 되도록 하십시오.

HDF5 데이터셋 생성기 인공지능 DeepLearning MachineLearning Augmentation python Classification HDF5 datasets kaggle dogs cats

AlexNet 아키텍처를 구현하고 Kaggle Dogs vs. Cats 데이터 세트에서 훈련하기 전에 먼저 HDF5 데이터 세트에서 이미지 및 레이블 배치를 생성하는 클래스를 정의해야합니다. 29 장에서는 디스크에 있는 이미지 세트를 HDF5 데이터 세트로 변환하는 방법에 대해 논의했습니다. 그러나 이를 다시 가져 오려면 어떻게해야합니까? 대답은 io 하위 모듈에 HDF5DatasetGenerator 클래스를 정의하는 것입니다.

이전에는 모든 이미지 데이터 세트를 메모리에 로드 할 수 있었으므로 Keras 생성기 유틸리티를 사용하여 이미지 배치와 해당 레이블을 생성 할 수있었습니다. 그러나 이제 데이터 세트가 너무 커서 메모리에 맞지 않으므로 이 생성기를 직접 구현해야합니다. 계속해서 hdf5datasetgenerator.py 파일을 열면 작업이 시작됩니다.

7 행에서 생성자를 HDF5DatasetGenerator에 정의합니다. 이 클래스는 여러 인수를받습니다. 그 중 2 개는 필수이고 나머지는 선택 사항입니다. 아래에 각 인수에 대해 자세히 설명하겠습니다.

• dbPath : 이미지와 해당 클래스 레이블을 저장하는 HDF5 데이터 세트의 경로입니다.

• batchSize : 네트워크를 훈련 할 때 산출 할 미니 배치의 크기입니다.

• preprocessors : 적용 할 이미지 전 처리기 목록 (예 : MeanPreprocessor, ImageToArrayPreprocessor 등).

• aug : 기본값은 None입니다. 또한 Keras ImageDataGenerator를 제공하여 HDF5DatasetGenerator 내부에서 직접 데이터 증가를 적용 할 수 있습니다.

• binarize : 일반적으로 클래스 레이블을 HDF5 데이터 세트 내에 단일 정수로 저장합니다. 그러나 우리가 알고 있듯이, 손실 함수로 범주형 교차 엔트로피 또는 이진 교차 엔트로피를 적용하는 경우 먼저 레이블을 원-핫 인코딩 벡터로 이진화해야합니다.이 스위치는 이 이진화가 수행되어야하는지 여부를 나타냅니다. (기본값은 True).

• classes : 데이터 세트에 있는 고유한 클래스 레이블의 수입니다. 이 값은 이진화 단계에서 원-핫 인코딩 된 벡터를 정확하게 구성하는 데 필요합니다.

이 변수는 12-16 행에 저장되어 있으므로 나머지 클래스에서 액세스 할 수 있습니다. 20행은 HDF5 데이터 세트 파일에 대한 파일 포인터를 엽니 다. 21행은 데이터 세트의 총 데이터 포인트 수에 액세스하는 데 사용되는 편의 변수를 생성합니다.

다음으로, 이름에서 알 수 있듯이 네트워크를 훈련 할 때 Keras .fit_generator 함수에 이미지 및 클래스 레이블 배치를 생성하는 생성기 함수를 정의해야합니다.

23 행은 선택적 인수를 받을 수있는 생성기 함수를 정의합니다. passes 값을 총 Epoch 수로 생각하십시오. 대부분의 경우 생성기가 총 Epoch 수에 신경쓰기를 원하지 않습니다. 우리의 훈련 방법론 (고정 된 epoch 수, 조기 중지 등)이 이를 책임 져야합니다. 그러나 특정 상황에서는 생성자에게 이 정보를 제공하는 것이 도움이되는 경우가 있습니다.

29 행에서 원하는 epoch 수에 대해 반복을 시작합니다. 기본적으로이 루프는 다음 중 하나가 될 때까지 무기한 실행됩니다.

1. Keras가 학습 종료 기준에 도달합니다.

2. 훈련 과정을 명시적으로 중지합니다 (예 : ctrl + c).

31 행은 데이터 세트의 각 데이터 포인트 배치에 대해 반복을 시작합니다. 33 행과 34 행의 HDF5 데이터 세트에서 batchSize 크기의 이미지와 라벨을 추출합니다. 다음으로 라벨이 원-핫 인코딩되어야하는지 확인합니다.

# check to see

if the labels should be binarized if self.binarize:

labels = np_utils.to_categorical(labels, self.classes)

그런 다음 이미지 전처리기를 적용해야하는지 확인할 수도 있습니다.

전처리기가 None이 아닌 경우(42 행) 배치의 각 이미지를 반복하고 개별 이미지에 대해 preprocess 메서드를 호출하여 각 preprocessors를 적용합니다. 이렇게하면 여러 이미지 전처리기를 함께 연결할 수 있습니다.

예를 들어 첫 번째 전처리기는 SimplePreprocessor 클래스를 통해 이미지를 고정된 크기로 조정할 수 있습니다. 거기에서 우리는 MeanPreprocessor를 통해 평균 빼기를 수행 할 수 있습니다. 그런 다음 ImageToArrayPreprocessor를 사용하여 이미지를 Keras 호환 배열로 변환해야합니다.

이 시점에서 우리가 모든 전처리 클래스를 preprocess 방법으로 정의한 이유가 명확해야합니다. 이를 통해 데이터 생성기 내에서 전처리기를 함께 연결할 수 있습니다. 그런 다음 전처리 된 이미지는 58 행에서 NumPy 배열로 다시 변환됩니다.

데이터 확대에 사용되는 ImageDataGenerator 클래스 인 aug 인스턴스를 제공했다면 이미지에도 데이터 확대를 적용 할 수 있습니다.

# if the data augmenator exists, apply it

if self.aug is not None:

(images, labels) = next(self.aug.flow(images, labels, batch_size=self.batchSize))

마지막으로 Keras 생성기에 이미지와 레이블 배치의 2- 튜플을 생성 할 수 있습니다.

69 행은 데이터 세트의 모든 미니 배치가 처리 된 후 총 epoch 수를 증가시킵니다. 71-73 행의 close 메소드는 단순히 HDF5 데이터 세트에 대한 포인터를 닫는 역할을 합니다.

물론 HDF5DatasetGenerator를 구현하는 것은 우리가 딥러닝을 수행하는 것처럼 “느낌”을 주지 못할 수도 있습니다. 결국 이것은 파일에서 데이터 일괄 처리를 담당하는 클래스가 아닌가? 기술적으로 맞습니다. 그러나 실용적인 딥러닝은 단순히 모델 아키텍처를 정의하고, 최적화 프로그램을 초기화하고,이를 데이터 세트에 적용하는 것 이상입니다.

실제로 데이터 세트, 특히 너무 커서 메모리에 맞지 않는 데이터 세트로 작업 할 수 있도록 도와주는 추가 도구가 필요합니다. 이 책의 나머지 부분에서 볼 수 있듯이 HDF5DatasetGenerator는 여러 번 유용하게 사용될 것입니다. 자신만의 딥 러닝 응용 프로그램 / 실험을 만들기 시작하면 레포지토리에 포함 시키는 것이 좋을 것입니다.

patchPreProcessor 패치 전처리 cropPreProcessor 크롭 전처리 DeepLearning MachineLearning Augmentation 파이썬 python Classification HDF5 datasets kaggle

PatchPreprocessor는 훈련 과정에서 이미지의 M × N 영역을 무작위로 샘플링합니다. 입력 이미지의 공간 차원이 CNN이 예상하는 것보다 클 때 패치 전처리를 적용합니다. 이는 과적 합을 줄이는 데 도움이되는 일반적인 기술이므로 정규화의 한 형태입니다. 훈련 중에 전체 이미지를 사용하는 대신, 대신 무작위로 잘라내어 네트워크로 전달합니다 (크롭 전처리의 예는 아래 그림 참조).

이 자르기를 적용한다는 것은 데이터 증가와 유사하게 네트워크가 똑같은 이미지를 볼 수 없음을 의미합니다 (무작위로 발생하지 않는 한). 이전 장에서 알 수 있듯이 각 이미지가 256×256 픽셀 인 Kaggle Dogs vs. Cats 이미지의 HDF5 데이터 세트를 구성했습니다. 그러나 이 장의 뒷부분에서 구현할 AlexNet 아키텍처는 227×227 픽셀 크기의 이미지 만 허용 할 수 있습니다. 어떻게 해야 할까요?

SimplePreprocessor를 적용하여 256×256 픽셀 각각의 크기를 227×227로 축소 하시겠습니까? 아닙니다. 이것은 훈련 중에 256×256 이미지에서 227×227 영역을 무작위로 잘라 데이터 증가를 수행 할 수있는 좋은 기회입니다. 실제로 이 프로세스는 Krizhevsky et al. ImageNet 데이터 세트에서 AlexNet을 훈련시킵니다. 다른 모든 이미지 전처리 기와 마찬가지로 PatchPreprocessor는 pyimagesearch의 전처리 하위 모듈에서 정렬됩니다.

5 행은 PatchPreprocessor에 대한 구성을 정의합니다. 잘라낸 이미지의 대상 너비와 높이를 제공하기 만하면됩니다. 그런 다음 전처리 기능을 정의 할 수 있습니다.

scikit-learn 라이브러리의 extract_patches_2d 함수를 사용하면 self.width x self.height 크기의 임의 패치를 쉽게 추출 할 수 있습니다. 입력 이미지가 주어지면이 함수는 이미지에서 패치를 무작위로 추출합니다. 여기서 max_patches = 1을 제공하여 입력 이미지에서 하나의 임의 패치 만 필요함을 나타냅니다.

PatchPreprocessor 클래스는 실제 쓰이는 법은 별로 보이지 않지만 실제로는 또 다른 데이터 증가 계층을 적용하여 과적합을 방지하는 매우 효과적인 방법입니다. AlexNet을 교육 할 때 PatchPreprocessor를 사용합니다. 다음 전처리 기인 CropPreprocessor는 훈련 된 네트워크를 평가할 때 사용됩니다.

다음으로 오버 샘플링을 위해 10 개의 크롭을 계산하는 CropPreprocessor를 정의해야합니다. CNN의 평가 단계에서 입력 이미지의 네 모서리 + 중앙 영역을 잘라낸 다음 해당 수평 반전을 수행하여 입력 이미지 당 총 10 개의 샘플을 얻습니다 (아래 그림).

왼쪽 : 원본 256 × 256 입력 이미지.

오른쪽 : 10 자르기 전처리기를 적용하여 중앙, 네 모서리 및 해당 수평 거울을 포함하여 이미지의 227 × 227 자르기 10 개를 추출합니다.

이 10 개의 샘플은 CNN을 통과 한 다음 확률이 평균화됩니다. 이 오버 샘플링 방법을 적용하면 분류 정확도가 1-2 % 증가하는 경향이 있습니다 (경우에 따라 더 높음). CropPreprocessor 클래스는 전처리 하위 모듈에 있습니다.

croppreprocessor.py 파일을 열고 정의 해 보겠습니다

# import the necessary packages

import numpy as np

import cv2

class CropPreprocessor:

def __init__(self, width, height, horiz=True, inter=cv2.INTER_AREA):

# store the target image width, height, whether or not

# horizontal flips should be included, along with the

# interpolation method used when resizing

self.width = width

self.height = height

self.horiz = horiz

self.inter = inter

6 행은 생성자를 CropPreprocessor에 정의합니다. 유일한 필수 인수는 잘린 각 영역의 대상 너비와 높이입니다. 또한 OpenCV가 크기 조정에 사용할 보간 알고리즘과 함께 수평 뒤집기를 적용할지 (기본값은 True) 여부를 선택적으로 지정할 수도 있습니다. 이러한 인수는 모두 preprocess 메서드 내에서 사용하기 위해 클래스 내부에 저장됩니다. 이제 preprocess 메서드을 정의 해 보겠습니다.

전처리 방법은 오버 샘플링을 적용 할 이미지 인 단일 인수만 필요합니다. 21 행에서 입력 이미지의 너비와 높이를 가져와서 네 모서리 (각각 왼쪽 위, 오른쪽 위, 오른쪽 아래, 왼쪽 아래)의 (x, y) 좌표를 계산할 수 있습니다) 22-26 행.

그런 다음 이미지의 중앙 자르기는 29 행과 30 행에서 계산 된 다음 31 행의 좌표 목록에 추가됩니다.

이제 각 크롭을 추출 할 준비가 되었습니다.

35 행에서 직사각형 크롭의 시작 및 끝 (x, y) 좌표를 반복합니다. 36 행은 NumPy 배열 슬라이싱을 통해 크롭을 추출한 다음 37 행에서 크기를 조정하여 목표 너비와 높이 치수가 충족되도록합니다. 크롭은 크롭 리스트에 추가됩니다.

수평 뒤집기를 계산해야하는 경우 5 가지 원본 크롭을 각각 뒤집어 전체적으로 10 가지 크롭을 남길 수 있습니다. #

그런 다음 자르기 배열이 48 행의 호출 함수로 반환됩니다. 정규화를 위해 MeanPreprocessor를 사용하고 오버 샘플링을 위해 CropPreprocessor를 사용하면 가능한 것보다 더 높은 분류 정확도를 얻을 수 있습니다.