используя 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. Мы просто надеемся, что он пригодится другим специалистам по данным, специалистам по машинному обучению.