Практическое руководство по использованию больших наборов данных изображений для глубокого обучения

Я расскажу, как получить набор данных ImageNet и обучить на нем вашу сверточную нейронную сеть. Я добавил несколько советов и уроков по обучению CNN с помощью PyTorch.

Перед тем, как начать

Если вы еще этого не сделали, я рекомендую сначала попробовать запустить вашу модель на образце изображения. Когда вы только начинаете, действительно заманчиво перейти к большому набору данных, например ImageNet, для обучения вашей следующей современной модели. Однако я считаю более эффективным начинать с малого и постепенно наращивать эксперимент. Сначала попробуйте изображение, чтобы убедиться, что ваш код работает. Затем попробуйте меньший набор данных, например CIFAR-10. Наконец, попробуйте в ImageNet. Попутно проводите проверки работоспособности и повторяйте их для каждого «увеличения».

Кроме того, помните о различиях в вашей модели для меньших размеров изображений одного набора данных по сравнению с другим. Например, CIFAR-10 имеет только изображения размером 32x32, что меньше, чем у ImageNet с переменными размерами изображений. Среднее разрешение изображения ImageNet - 469x387. Обычно они обрезаются до 256x256 или 224x224 на этапе предварительной обработки изображения.

В PyTorch мы не определяем высоту или ширину ввода, как в TensorFlow, поэтому ваша задача - удостовериться, что размеры выходных каналов подходят в вашей сети для заданного размера ввода. Я советую с осторожностью относиться к тому, как происходит уменьшение размерности от мелких до более глубоких фильтров в вашей сети, особенно при изменении набора данных.

В общем, когда вы увеличиваете разрешение ввода для нового набора данных, поле раннего восприятия также должно увеличиваться в размере (за счет увеличения размера ядра или добавления слоев пула).

Это по двум причинам:

  1. Увеличение размера раннего рецептивного поля - это форма регуляризации, чтобы защитить вашу CNN от изучения сверхспецифических деталей изображений, которые менее универсальны.
  2. При уменьшении входного разрешения это поможет избежать преждевременного уменьшения размера канала. Применение свертки к тензору размером 256x1x1 бесполезно.

Обе эти ошибки завершаются с ошибкой без уведомления. Эти ошибки приводят к только 8% снижению первой 1 точности, когда ResNet в форме ImageNet неправильно применяется к CIFAR-10. Чтобы исправить эту ошибку, при переходе от CIFAR-10 к ImageNet авторы ResNet добавляют ранний уровень максимального пула и используют больший начальный размер ядра (5x5 → 7x7).

Я бы очень рекомендовал прочитать этот пост в блоге Андрея Карпати для более глубокого понимания этого искусства. Я также порекомендовал бы этот пост Тима Рокташеля для советов по краткосрочным проектам машинного обучения.

Загрузка ImageNet

Лучше всего это делать в облачной среде. Если у вас нет доступа к мощному графическому процессору и большому SSD, я бы не рекомендовал делать это локально.

Перед проведением любого обучения разверните экземпляр Google Colab или экземпляр AWS SageMaker, чтобы использовать Jupyter Notebook для экспериментов с вашей моделью и визуализации передаваемых данных. Затем, когда вы захотите обучить свою модель, я бы рекомендовал использовать скрипт и развертывание инстанса EC2 с помощью AWS Deep Learning AMI. Подключите к EC2 экземпляр EBS с достаточным объемом памяти для загрузки и разархивирования ImageNet. Для ImageNet 2012 размер сжатой загрузки составляет 150 ГБ. Но вам понадобится ~ 400 ГБ, так как вам нужно достаточно места, чтобы распаковать файлы, а затем удалить .tar. Использование экземпляра EBS также означает, что вы можете обновить свой EC2 без повторной загрузки данных.

Теперь, чтобы фактически загрузить ImageNet, официальные инструкции заключаются в том, чтобы зарегистрироваться в качестве исследователя в вашем исследовательском учреждении здесь.

Я не думаю, что Стэнфорд поддерживает это в течение некоторого времени, потому что вы никогда не получите приглашение по электронной почте. Итак, я обнаружил, что эффективно загрузить ImageNet с Academic Torrents.

Найдите ImageNet, получите нужные магнитные ссылки и используйте интерфейс командной строки для загрузки торрентов с помощью Transmission. Убедитесь, что у вашего экземпляра есть доступ в Интернет!

sudo yum install transmission transmission-daemon transmission-cli

Затем настройте каталог загрузки

transmission-daemon --download-dir "your-download-directory-path"

И добавьте свою магнитную ссылку

transmission-remote -a "magnet-link"

Найдите другие важные команды здесь.

После того, как вы загрузили сжатые файлы, мы хотели бы извлечь их и поместить в нужные папки, чтобы они соответствовали ожиданиям класса PyTorch ImageFolder, как описано в документации здесь.

Поместите ILSVRC2012_img_train.tar и ILSVRC2012_img_val.tar в ту же папку, что и следующий сценарий, чтобы получить нужные папки. Отредактируйте по мере необходимости для вашего конкретного торрента.

Я также рекомендую выбросить оба файла .tar в корзину в S3, чтобы вы могли получить их оттуда в следующий раз. Не выбрасывайте несжатые файлы, так как вы платите за отдельные запросы за объект в S3.

Настройка загрузчиков данных

Я бы рекомендовал настроить использование PyTorch DataLoader и ImageFolder в модуле с названием набора данных. Я обнаружил, что легко хранить дополнения для конкретных наборов данных в разных файлах. Вот пример imagenet.py для использования с ResNet. Задайте размер пакета по умолчанию, нормализующее преобразование и кадрирование, специфичное для этого набора данных. Возможно, в другом файле, например cifar10.py, у вас может быть загрузчик набора данных с настройками, специфичными для cifar-10 (с другим размером пакета, нормализацией и кадрированием).

Обучение с ImageNet

Я бы не рекомендовал обучать модель на массивном наборе данных, таком как ImageNet или Sports1M, в блокноте Jupyter. У вас могут быть тайм-ауты, и ваш экземпляр отключится от stdout, что приведет к тому, что вы не увидите прогресса, которого делает ваша модель. Более безопасный вариант - войти по ssh и потренироваться со сценарием на экране.

Я бы также рекомендовал использовать neptune.ai для отслеживания прогресса на аккуратной визуальной панели. Некоторые люди используют TensorBoard или TensorBoardX для pytorch, но я еще не пробовал это испытать. Мне понравился neptune.ai, потому что он сохраняет мои результаты даже после того, как я закрыл экземпляры, и позволяет мне легко сравнивать эксперименты.

Теперь используйте ваши загрузчики данных с вашей моделью, вашим выбором оптимизатора и вашим выбором потерь для обучения в ImageNet. Это будет похоже на вариацию следующего псевдокода:

# one epoch
for i, (images, target) in enumerate(train_loader):
        # compute output
        output = model(images)
        loss = criterion(output, target)
        # measure accuracy and record loss
        acc1, acc5 = accuracy(output, target, topk=(1, 5))
        losses.update(loss.item(), images.size(0))
        top1.update(acc1[0], images.size(0))
        top5.update(acc5[0], images.size(0))
        # compute gradient and do step
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

Это только для тренировки. Используйте это в цикле с функцией проверки, чтобы чередовать обучение и оценку для проверки, установленной в каждую эпоху. Дополнительные примеры того, как это сделать, можно найти в официальных примерах PyTorch здесь.

Не забудьте хотя бы один раз проверить данные, прежде чем они попадут в вашу сеть. Это означает на самом деле визуализировать это. Ниже приведен образец проверки работоспособности, чтобы убедиться, что все идет хорошо во время предварительной обработки.

Для полноты картины я добавил код над проверкой работоспособности для генерации денормализационного преобразования (для просмотра фактического изображения без эффектов нормализации).

Теперь получайте удовольствие от тренировок и сохраняйте рассудок с помощью проверок на здравомыслие! 😄