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

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

Таким образом, цель состояла в том, чтобы убедиться, что сериализация/десериализация каждой модели, реализованной в Shogun, которая требует обучения, работает должным образом, другими словами, если вы обучаете модель, применяйте ее. к некоторым данным, сохраните и перезагрузите их, повторно примените к тем же данным, вы получите согласованные результаты. Что может пойти не так? В языке без отражения, таком как C++, единственным вариантом является использование некоторого ручного механизма, который регистрируетпараметры модели для их вывода во время сериализации, так что может случиться так, что разработчик забудет некоторые что приводит к мусорным результатам после десериализации.

Очевидно, что если целью является выявление человеческих ошибок, эти тесты должны быть сгенерированы автоматически, иначе мы вернемся к исходной точке, поскольку можно забыть добавить тест для модели. Как это сделать? У Shogun уже был скрипт на Python, который выполняет некоторый синтаксический анализ дерева исходного кода с помощью регулярных выражений для реализации сериализации и создания тестов для сериализации в различных форматах (XML, JSON, ASCII, HDF5).

Поскольку тест должен создаваться для каждой модели, которая является потомком определенного класса (т. е. всех LinearMachine), мой первый подход состоял в том, чтобы немного расширить сценарий, чтобы он строил иерархию классов, чтобы для каждого класса я мог ответить на вопрос. вопрос: является ли класс Y потомком X? Скрипт сработал, но, как оказалось, усложнять и без того хакерский подход — не лучшая идея (это может быть нормально… или нет, как хорошо знает мой коллега Майк) , от которого рано или поздно придется отказаться.

Вместо этого Heiko предложил повторно использовать другую зависимость Shogun: Ctags, этот инструмент строит индекс классов, методов и т. Д. В дереве исходного кода и в основном используется редакторами кода для быстрого перемещения по базе кода, т. е. следуя определениям. . Этот (текстовый) индекс можно легко использовать для наших целей, настроив Ctags для вывода информации о наследовании и поиска таких строк, как:

CLeastSquaresRegression /some/path/shogun/src/shogun/regression/LeastSquaresRegression.h   /^class CLeastSquaresRegression : public CLinearRidgeRegression$/;"    c  namespace:shogun   inherits:CLinearRidgeRegression

Много разговоров… мало кода, так что давайте посмотрим, чего я уже добился: PR #3751 настраивает механизм генерации тестов и применяет его к LinearMachines (LinearRidgeRegression, Perceptron и т. д.); PR #3933 добавляет KernelMachines, такие как KernelRidgeRegression, и различные типы SVM; PR #3942 добавляет MulticlassMachines и устраняет проблемы с сериализацией в (Multiclass)LDA и QDA.

Что дальше? План состоит в том, чтобы добавить гауссовские процессы и препроцессоры, для обоих потребуется несколько иной подход к тестированию, чем в предыдущих случаях. На этом пока все, спасибо за прочтение!