Сегодня я буду обучать модель, которая будет распознавать написанные от руки цифры от 0 до 9, используя набор данных MNIST. Я буду использовать библиотеку Fast.ai для обучения модели глубокого обучения на вышеуказанном наборе данных.

Получение набора данных:

path = untar_data(URLs.MNIST)

Для функции Untar_data требуется URL-адрес.

Чтобы проверить URL-адрес для определенного набора данных, используйте следующее:

URL.MNIST

Мы можем проверить содержимое набора данных, используя path.ls()

Ниже приведен вывод:

[PosixPath('/content/data/mnist_png/training'),

PosixPath(‘/content/data/mnist_png/testing’)]

Как мы видим, есть 2 каталога для обучения и тестирования наборов данных.

Мы должны помнить, что у нас нет отдельного набора данных для проверки, поэтому нам придется создать его, используя приведенный ниже код. Здесь я выбираю набор данных проверки 20%.

data= ImageDataBunch.from_folder(path= path, train=’training’, test= ‘testing’, valid_pct=0.2 )

Давайте визуализируем данные, которые мы только что создали:

data.show_batch(rows=7,figsize= (8,5))

Чтобы проверить общее количество категорий: data.c

Чтобы проверить названия категорий: data.classes

Теперь давайте обучим модель с помощью трансферного обучения.

learn = cnn_learner(data,base_arch=models.resnet34, metrics= [частота_ошибок, точность])

Cnn_learner — это метод класса fastai.vision.learner.

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

Теперь мы применим политику одного цикла, которая, по сути, представляет собой количество раз, которое модель просматривает каждый обучающий пример. Следует отметить, что каждый раз модель будет лучше распознавать обучающие примеры, поэтому следует следить за вероятностью переобучения. Здесь я буду тренироваться 4 раза.

learn.fit_one_cycle(4)

Вышеприведенное создаст некоторые веса, которые мы сохраним в следующем коде:

learn.save('stage1')

Теперь я буду использовать класс ClassificationInterpretation для создания матрицы путаницы и построения неправильно классифицированных изображений. Я передам модель обучения в качестве объекта.

inter= ClassificationInterpretation.from_learner(learn)

Теперь я построю максимальные потери, используя ниже:

inter.plot_top_losses(9, figsize=(15, 11))

Теперь я построю матрицу путаницы:

inter.plot_confusion_matrix()

Матрица путаницы говорит вам, сколько раз модель предсказывала еду как ее фактическую категорию или неправильную категорию.

Вы можете проверить классы, в которых модель показала себя очень плохо, используя следующее:

inter.most_confused(min_val=2)

Ниже приведена лишь часть длинного списка:

[(‘2’, ‘8’, 30),

(‘5’, ‘3’, 22),

(‘7’, ‘9’, 21),

(‘3’, ‘5’, 15),

(‘8’, ‘9’, 15),

(‘3’, ‘8’, 14),

(‘5’, ‘8’, 14),

(‘4’, ‘9’, 13),

(‘8’, ‘2’, 13),

(‘9’, ‘8’, 13),

(‘2’, ‘3’, 12),

(‘9’, ‘7’, 12),

(‘3’, ‘2’, 11),

(‘4’, ‘7’, 9),

Теперь я найду скорость обучения, чтобы выбрать лучшую, используя learn.lr_find(), и построить то же самое, используя приведенное ниже:

learn.recorder.plot()

plt.title("Потери и скорость обучения")

Скорость обучения показывает, насколько быстро мы обновляем параметры в нашей модели. Это тот момент, когда мы точно настраиваем нашу модель. Мы попытаемся улучшить нашу модель, тщательно выбрав скорость обучения. Здесь мы видим, что после 1e-04 потери продолжают расти. Таким образом, мы выберем наш диапазон от e-6 до e-4.

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

learn.unfreeze(): в основном говорится об обучении всей модели.

Теперь мы снова подгоним модель, но с учетом нашей скорости обучения:

learn.fit_one_cycle(2, max_lr=slice(1e-6,1e-4)).

Slice(): это функция Python, которая распределяет диапазон значений по модели, то есть она будет использовать начальные значения в начале слоев и конечные значения для конечных слоев.

И, как и ожидалось, наша модель точнее:

Итак, на этом моя задача завершена. Пожалуйста, хлопайте, если вам понравилось. Спасибо и хорошего дня