Недавно я написал классификатор, который умеет отличать собак от кошек.
Чему я научился:
0. Как использовать предварительно обученную модель
1. Применить трансферное обучение

Набор данных:

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

Ну, я должен сказать, что это не подключи и играй. По крайней мере, не для API `torchvision`. `torchvision` имеет папку `ImageFolder`, которая (сейчас) является стандартом для загрузки изображений, а также метки автоматически. В документе предполагается, что `ImageFolder`требуется набор данных в следующем формате:

root/dog/xxx.png
root/dog/xxy.png
root/dog/xxz.png
root/cat/123.png
root/cat/nsdf3.png
root/cat/asd932_.png

Итак, я упорядочил набор данных так, как требует ImageFolder.

Модель:

Выбор произвольный. Я рассматривал какую-нибудь проводную модель. Я не знаю, как это назвать.

self.conv1 = nn.Conv2d(3, 8, 5)
self.pool = nn.MaxPool(2, 2)
self.conv2 = nn.Conv2d(8, 16, 3)
self.conv3 = nn.Conv2d(16, 32, 3)
self.conv4 = nn.Conv2d(32, 64, 3)
self.conv5 = nn.Conv2d(64, 64, 3)
self.fc1 = nn.Linear(64 * 5 * 5, 1000)
self.fc2 = nn.Linear(1000, 500)
self.fc3 = nn.Linear(500, 120)
self.fc4 = nn.Linear(120, 84)
self.fc5 = nn.Linear(84, 10)
self.fc6 = nn.Linear(10, 2)

С ReLu повсюду и слоем softmax в конце. Это сработало, но не так, как я думал. И он все еще меньше, чем стартовый ResNet, который называется ResNet18. Итак, я рассмотрел ResNet18 в своей сети.

Обучение:

Я подумал об обучении ResNet18 для всего набора данных. Но главная проблема в том, что у меня нет графического процессора. (ノಠ益ಠ)ノ彡┻━┻
Так что трансферное обучение — единственный выбор, который у меня есть. Я выбрал предварительно обученную модель, которая обучается на ImageNet.

Варианты, которые у меня есть:
0. Полная предварительно обученная модель
1. Тонкая настройка ConvNet
2. ConvNet как экстрактор фиксированных функций

Полная предварительно обученная модель:

Я должен сказать вам, что использовать это бесполезно. Это просто работает. Вам не нужно ничего делать. Вам просто нужно написать функцию прогнозирования.

Тонкая настройка ConvNet:

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

ConvNet как экстрактор фиксированных функций:

Взяв всю сеть, добавив последний слой и обучив только последний слой с помощью softmax, мы сделали свою работу. Результаты соответствуют ожиданиям. Кроме того, это занимает слишком меньше времени по сравнению с полным обучением и тонкой настройкой ConvNet. Результаты почти такие же, как и у метода Fine-Tuning.

Прогнозы:

У меня более 91% точности.

Я попробовал какой-то собачий фильтр на правине, просто чтобы проверить, может ли он правильно его классифицировать. Ну, он классифицировал его как кошку. Похоже, есть еще что сделать. ┬──┬ ノ( ゜-゜ノ)

Исходный код:

ГнанешКунал/классификатор собак и кошек

Полезные ссылки:

* Перенос обучения
* Resnet
* Визуализация и понимание сверточных сетей
* PyTorch