Когда у вас есть хороший рабочий алгоритм и вы хотите протестировать свой шедевр на каком-то наборе данных, почти всегда приходится тратить довольно много времени на фактическую загрузку и предварительную обработку данных. Было бы неплохо, если бы мы могли иметь все данные в одном едином формате и согласованный способ доступа к данным (например, всегда хранить обучающие изображения под ключом «поезд / изображение»).

Здесь я расскажу о написанном мной репозитории на github, который конвертирует несколько популярных наборов данных в формат HDF5. В настоящее время поддерживает следующие наборы данных.

Что делает этот код?

Итак, этот репозиторий делает довольно много вещей. Сначала позвольте мне рассказать вам об организации. Кодовая база довольно проста. У него есть один файл для каждого набора данных для предварительной обработки данных и сохранения в формате HDF5 (например, для Imagenet у нас есть preprocess_imagenet.py, CIFAR-10 и CIFAR-100 у нас есть preprocess_cifar.py, а для SVHN у нас есть preprocess_svhn.py). По сути, каждый файл выполняет следующие функции:

  • Загрузите исходные данные в память
  • Выполните любое изменение формы, необходимое для получения данных с надлежащей размерностью (например, набор данных cifar дает изображение в виде вектора, поэтому необходимо преобразовать его в 3-мерную матрицу)
  • Создайте файл HDF5 для сохранения данных в
  • Используйте многопроцессорную библиотеку Python и обрабатывайте каждое изображение в соответствии с требованиями пользователя.

Ниже я расскажу, что делает файл ImageNet. Это самый сложный файл, а остальные довольно просты.

Здесь я обсуждаю, что делает preprocess_imagenet.py файл. Это в основном сохраняет подмножество данных ImageNet в виде файла HDF5. Это подмножество - это данные, относящиеся к ряду естественных классов (например, растения, кошка) и искусственных классов (например, стул, стол). Кроме того, вы можете нормализовать данные при сохранении данных.

Функция save_imagenet_as_hdf5(...) вступает во владение, как только вы запускаете сценарий. Эта функция сначала создает сопоставление между действительными именами файлов набора данных и метками (например, build_or_retrieve_valid_filename_to_synset_id_mapping(...). Затем она изолирует классы, связанные с проблемой классификации набора данных ImageNet (1000 классов) с помощью write_art_nat_ordered_class_descriptions(...) или retrieve_art_nat_ordered_class_descriptions(...). Затем мы записываем информацию о выбранных искусственных и естественных классах в файл xml с помощью метода write_selected_art_nat_synset_ids_and_descriptions(...).

Затем мы просматриваем все подкаталоги в обучающих данных и загружаем все связанные точки данных в память. Затем мы создаем файлы HDF для сохранения данных. это делается с помощью функции save_train_data_in_filenames(...). Данные будут сохранены под следующими ключами:

  • /train/images/
  • /train/images/
  • /valid/images/
  • /valid/images/

Доступ и загрузка данных позже

Вы можете получить доступ к этим сохраненным данным позже как:

dataset_file = h5py.File(“data” + os.sep + “filename.hdf5”, “r”)
train_dataset, train_labels = dataset_file[‘/train/images’], dataset_file[‘/train/labels’]
test_dataset, test_labels = dataset_file[‘/test/images’], dataset_file[‘/test/labels’]

Код и дальнейшее чтение

Код доступен здесь, и вы можете просмотреть полное описание того, что делает код и как его запускать, в моем сообщении в блоге.

Примечание. Если вы видите какие-либо проблемы или ошибки, возникающие при запуске кода, сообщите мне об этом в комментариях или открыв проблему на странице Github. Это поможет мне улучшить код, избавившись от надоедливых ошибок.

Ваше здоровье!