Мы воспользуемся предварительно обученной моделью ResNet34 и создадим классификатор изображений собаки и кошки, используя библиотеку fastai, которая работает поверх PyTorch.

TL; DR: весь код доступен на Github в этом блокноте Jupyter.

Мы собираемся получить набор данных из конкурса Kaggle:
Собаки против кошек Redux: Kernels Edition.
В нем 25 000 изображений (12 500 собак и 12 500 кошек).

Для работы нашего ноутбука нам понадобится компьютер с графическим процессором. Мы можем использовать Google’s Colab, Amazon Web Services, Paperspace, Google Cloud Platform или любую облачную платформу, которая вам нравится, для настройки машины с графическим процессором. (Щелкните ссылки, чтобы просмотреть шаги по настройке машины со всеми необходимыми зависимостями.)

Fastai работает поверх PyTorch и помогает быстро приступить к работе и создавать модели машинного обучения с минимальными усилиями. Он выбирает правильные параметры, такие как используемый метод обратного распространения, гиперпараметры, необходимые для конкретной модели и т. Д.

Все, что нам нужно сделать, это установить PyTorch и fastai с помощью pip.

$ pip install torch torchvision
$ pip install fastai

kaggle-cli - удобный инструмент командной строки для загрузки наборов данных из kaggle или даже для отправки материалов через kaggle. Установите его также с помощью следующей команды:

$ pip install kaggle-cli

Чтобы загрузить набор данных, просто введите следующую команду со своим именем пользователя и паролем Kaggle, затем распакуйте набор данных в data/ каталог (Примечание: вы должны принять условия конкурса, попытавшись загрузить набор данных, а затем отменив его. перед использованием этой команды):

$ kg download -u username -p password -c dogs-vs-cats-redux-kernels-edition
$ mkdir data
$ unzip test.zip -d data/
$ unzip train.zip -d data

Мы будем использовать ResNet34, 34-х слойную CNN-модель.

Изображения собак и кошек находятся в одной папке (data/train/), поэтому нам нужно создать файл labels.csv для хранения имен файлов и соответствующих им меток (собака или кошка).

PATH = 'data/'
files = os.listdir(f'{PATH}train')
raw_data = {'fname': [], 'label': []}
for fname in files:
  raw_data['fname'].append(fname)
  raw_data['label'].append(fname[:3])
df = pd.DataFrame(raw_data, columns = ['fname', 'label'])
df.to_csv(f'{PATH}labels.csv', index = False)

Мы также можем визуализировать набор данных:

Набор для проверки не предоставляется, поэтому нам нужно создать свой собственный из набора обучающих данных. get_cv_idxs(n) случайным образом возвращает 20% индексов от 0 до n.

Примените преобразования изображений, такие как переворот бокового зеркала, масштабирование и т. Д., Чтобы создать больше изображений для набора данных. Затем создайте объект data:

Метод learn.lr_find() помогает найти оптимальную скорость обучения. Он использует технику, разработанную в статье 2015 года Циклические скорости обучения для обучения нейронных сетей, где мы просто продолжаем увеличивать скорость обучения с очень небольшого значения, пока потери не перестанут уменьшаться. Мы можем построить график скорости обучения по пакетам, чтобы увидеть, как это выглядит, и найти скорость обучения, когда потери уменьшаются.

Мы получаем данные и создаем обучающий объект, используя функцию ConvLearner.pretrained (), где arch = resnet34 и ps=0.5, которые предназначены для исключения в последнем слое для лучшего обобщения. Мы запускаем функцию fit () 2 эпохи и скорость обучения 1e-2, которые мы нашли ранее.

Мы устанавливаем precompute = False и запускаем еще несколько циклов эпох, а затем сохраняем модель.

Мы увеличиваем размер каждого изображения в get_data () и запускаем больше эпох.

Мы используем cycle_mult=2 для перезапуска стохастического градиентного спуска (SGDR) для лучшего обобщения и поддержки изменчивости данных моделью.

Мы выполняем Увеличение времени тестирования (TTA) для повышения точности проверочного теста и строим матрицу неточностей.

Очевидно, мы видим, что модель очень хорошо обучена, и мы получаем точность 99,2% на изображениях, которых наша модель никогда раньше не видела.

Запустите функцию прогнозирования по набору тестов, чтобы получить прогнозы журнала, и возьмите их показатели, чтобы получить фактическую вероятность:

Теперь мы можем сохранить результаты тестового набора данных в указанном формате установщиками задач на Kaggle и отправить результаты с помощью kaggle-cli:

Мы получили 0,05943 балла, чем меньше балл, тем лучше. С таким счетом мы бы заняли место почти в 150 из 1300 команд в таблице лидеров.

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

Вы также можете подписаться на меня в Twitter по адресу @ShrimalAnubhav, посмотреть мое портфолио или найти меня в LinkedIn и Facebook. Я был бы рад получить известие от вас.