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는 여러 번 유용하게 사용될 것입니다. 자신만의 딥 러닝 응용 프로그램 / 실험을 만들기 시작하면 레포지토리에 포함 시키는 것이 좋을 것입니다.