Создание собственных плагинов

Библиотека Mind.js предоставляет гибкую систему расширений через плагины, позволяя добавлять новые функции к ядру нейронной сети без изменения базового кода. Плагины могут включать дополнительные алгоритмы обучения, кастомные функции активации, обработку данных или интеграцию с внешними источниками информации.

Структура плагина

Плагин в Mind.js представляет собой объект с заранее определёнными ключами и методами. Минимальная структура включает следующие элементы:

const MyPlugin = {
    name: 'MyPlugin',       // Название плагина
    version: '1.0.0',       // Версия плагина
    init: function(mind) {  // Функция инициализации
        // Логика подключения к ядру Mind.js
    },
    hooks: {}                // Словарь хуков для расширения функционала
};
  • name и version нужны для идентификации и управления зависимостями.
  • init вызывается при регистрации плагина в системе.
  • hooks позволяют вставлять пользовательский код в жизненный цикл сети, например, перед обучением, после обработки данных или при расчёте ошибки.

Регистрация плагина

Для того чтобы плагин начал работать, его нужно зарегистрировать через основной объект Mind.js:

mind.use(MyPlugin);

Метод use автоматически вызывает функцию init плагина и активирует все объявленные хуки. Плагины могут быть зарегистрированы как до создания сети, так и после, если требуется расширение функционала динамически.

Хуки и события

Mind.js использует хуки для интеграции пользовательского кода. Наиболее важные типы хуков:

  • beforeTrain — выполняется перед началом обучения сети.
  • afterTrain — вызывается после завершения обучения.
  • beforeForward — позволяет изменять входные данные перед прямым распространением.
  • afterForward — используется для модификации выходных данных.
  • onError — вызывается при возникновении ошибок.

Пример использования хуков в плагине:

const LoggingPlugin = {
    name: 'LoggingPlugin',
    version: '1.0.0',
    init: function(mind) {
        this.hooks.beforeTrain = (data) => {
            console.log('Начало обучения с данными:', data);
        };
        this.hooks.afterTrain = (network) => {
            console.log('Обучение завершено. Текущая сеть:', network);
        };
    },
    hooks: {}
};

Создание кастомных функций активации

Плагины могут добавлять собственные функции активации для нейронов. Mind.js ожидает, что каждая функция активации будет объектом с методами activate и derivative:

const SigmoidPlugin = {
    name: 'SigmoidPlugin',
    version: '1.0.0',
    init: function(mind) {
        mind.addActivationFunction('customSigmoid', {
            activate: (x) => 1 / (1 + Math.exp(-x)),
            derivative: (y) => y * (1 - y)
        });
    },
    hooks: {}
};

После добавления функции её можно использовать при создании слоёв нейронной сети:

const network = new mind.Network({
    layers: [
        { size: 3, activation: 'customSigmoid' },
        { size: 1, activation: 'customSigmoid' }
    ]
});

Работа с данными

Плагины часто применяются для предобработки и нормализации данных. Для этого можно использовать хуки beforeTrain или beforeForward:

const NormalizationPlugin = {
    name: 'NormalizationPlugin',
    version: '1.0.0',
    init: function(mind) {
        this.hooks.beforeTrain = (data) => {
            return data.map(d => d.map(value => value / 255));
        };
    },
    hooks: {}
};

Этот подход позволяет централизованно управлять всеми преобразованиями, не вмешиваясь в код сети напрямую.

Совместимость и конфликты

Mind.js поддерживает последовательное использование нескольких плагинов. Для предотвращения конфликтов важно:

  • Уникально именовать плагины и функции.
  • Проверять наличие уже зарегистрированных хуков.
  • Не изменять глобальные объекты напрямую.

Динамическое подключение плагинов

Плагины можно подключать и удалять во время работы программы. Метод unuse позволяет отключить плагин, удалив его хуки и функции:

mind.unuse('LoggingPlugin');

Это удобно для экспериментов с различными алгоритмами без перезапуска сети.

Примеры комплексного плагина

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

const AdvancedPlugin = {
    name: 'AdvancedPlugin',
    version: '1.0.0',
    init: function(mind) {
        mind.addActivationFunction('tanhCustom', {
            activate: x => Math.tanh(x),
            derivative: y => 1 - y * y
        });

        this.hooks.beforeTrain = (data) => {
            console.log('Подготовка данных...');
            return data.map(d => d.map(value => value / 100));
        };

        this.hooks.afterTrain = (network) => {
            console.log('Сеть обучена с использованием AdvancedPlugin.');
        };
    },
    hooks: {}
};

Такой подход демонстрирует, как плагины могут объединять несколько уровней расширений, делая Mind.js гибким инструментом для сложных проектов машинного обучения.