используя msdlib

Вступление:

Pytorch — это самый гибкий инструмент разработки на основе Python для создания моделей глубокого обучения. Сегодня мы собираемся обсудить самый простой способ построить модель классификации в Pytorch и обучить + проверить производительность модели для задачи классификации нескольких классов.

Задача многоклассовой классификации:

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

Для этой задачи нам нужны метки классов для обучающих данных. А для проверочных данных мы будем использовать обученную модель для создания прогнозов классов.

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

Здесь мы будем использовать набор данных MNIST, который доступен в библиотеке scikit-learn в подмодуле наборов данных. Это набор данных распознавателя цифр. Для этой задачи общее количество классов равно 10 (цифры 0 ~ 9).

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

Импорт библиотек:

import pandas as pd
from sklearn.datasets import load_digits
import torch
import os
import sys
from msdlib import mlutils
from msdlib import msd

Для установки msdlib перейдите сюда: https://github.com/abdullah-al-masud/msdlib

Загрузка и организация метки данных:

source_data = load_digits()
feature_names = source_data[‘feature_names’].copy()
data = pd.DataFrame(source_data[‘data’], columns=feature_names)
label2index = {name: i for i, name in enumerate(source_data[‘target_names’])}
label = pd.Series(source_data[‘target’]).replace(label2index)

Стандартизация и разделение:

data = msd.standardize(data)
splitter = msd.SplitDataset(data, label, test_ratio=.1)
outdata = splitter.random_split(val_ratio=.1)

Определение слоев модели:

Здесь мы определяем слои модели, количество единиц/нейронов в каждом скрытом слое, функцию активации, коэффициент отсева и т. д.

layers = mlutils.define_layers(
    input_units=data.shape[1],
    output_units=label.unique().shape[0],
    unit_factors=[100, 100, 100, 100, 100, 100],
    dropout_rate=.2,
    actual_units=True,
    activation=torch.nn.ReLU(),
    model_type=’regressor’
)

Одна вещь, на которую следует обратить внимание в приведенном выше разделе кода. «model_type» записывается как «регрессор», что может немного вводить в заблуждение, поскольку наша цель — построить модель классификации с несколькими классами. Но здесь мы собираемся использовать «регрессор», чтобы выходные данные модели не проходили через функцию активации softmax. Позже мы будем использовать класс torch.nn.CrossEntropyLoss в качестве функции потерь, которая внутренне применяет softmax во время расчета потерь. Для предсказания, если нам нужна вероятность в качестве выходных данных модели, нам нужно дополнительно применить softmax.

Еще один способ — определить здесь model_type как «мультиклассификатор» и использовать torch.nn.NLLLoss в качестве функции потерь в следующем разделе.

Регистрация модели как класса torchModel:

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

tmodel = mlutils.torchModel(
    layers=layers,
    model_type=’multi-classifier’,
    tensorboard_path=’runs’,
    savepath=’examples/multiclass-classification_torchModel’,
    batch_size=64,
    epoch=150,
    learning_rate=.0001,
    lr_reduce=.995
)

Здесь, используя «model_type» в качестве «мультиклассификатора», мы говорим классу torchModel применить CrossEntropyLoss (наряду с несколькими другими вещами). Но если мы хотим использовать функцию NLLLoss, нам нужно указать ее здесь с аргументом «loss_func». В обоих случаях мы должны использовать «мультиклассификатор» для определения model_type здесь.

Этот процесс регистрации также принимает пользовательскую модель в качестве входных данных в качестве аргумента модель. Полную документацию можно найти здесь: https://msdlib.readthedocs.io/en/latest/mlutils.html#msdlib.mlutils.torchModel.

Обучение модели:

tmodel.fit(
    outdata[‘train’][‘data’],
    outdata[‘train’][‘label’],
    val_data=outdata[‘validation’][‘data’],
    val_label=outdata[‘validation’][‘label’]
)

После обучения модели кривая обучения будет сохранена в указанном каталоге с параметром savepath при регистрации модели.

Функция подгонки принимает массив numpy в качестве входных данных. Он также может принимать входные данные тензора факела, а также загрузчик данных pytorch в качестве входных данных. Полную документацию можно найти здесь: https://msdlib.readthedocs.io/en/latest/mlutils.html#msdlib.mlutils.torchModel.fit.

Оценка модели:

result, all_results = tmodel.evaluate(
    data_sets=[outdata[‘train’][‘data’], outdata[‘test’][‘data’]],
    label_sets=[outdata[‘train’][‘label’], outdata[‘test’][‘label’]],
    set_names=[‘Train’, ‘Test’],
    savepath=’examples/multiclass-classification_torchModel’
)

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

Выходные данные:

Полную документацию по msdlib можно найти здесь: https://msdlib.readthedocs.io/en/latest/index.html.

Дополнительные примеры можно найти в других историях на этом среднем канале.

Примеры кода различных функций использования msdlib можно найти здесь — https://github.com/abdullah-al-masud/msdlib/tree/master/examples.

Мы высоко ценим вашу поддержку в распространении msdlib. Мы просто надеемся, что он пригодится другим специалистам по данным, специалистам по машинному обучению.