Организация кода проекта

Для работы с Mind.js требуется Node.js версии не ниже 12 и современный браузер для фронтенд-реализаций. Установка через npm выполняется командой:

npm install mind

После установки библиотеку можно подключить в проекте:

const { Mind, Layer, Neuron } = require('mind');

Для фронтенд-проектов возможно подключение через тег


Структура проекта с Mind.js

Организация кода критична для масштабируемых проектов. Рекомендуется делить проект на следующие модули:

  1. Конфигурация сети Файл config/network.js содержит параметры слоёв, нейронов, функций активации:
module.exports = {
    layers: [
        { type: 'input', size: 3 },
        { type: 'hidden', size: 5, activation: 'relu' },
        { type: 'output', size: 2, activation: 'softmax' }
    ],
    learningRate: 0.01,
    epochs: 1000
};
  1. Модель сети Файл models/neuralNetwork.js отвечает за создание и инициализацию сети:
const { Mind, Layer } = require('mind');
const config = require('../config/network');

function createNetwork() {
    const mind = new Mind({ learningRate: config.learningRate });
    config.layers.forEach(layerConfig => {
        mind.addLayer(new Layer(layerConfig));
    });
    return mind;
}

module.exports = createNetwork;
  1. Обучение и тестирование Файл train/trainNetwork.js содержит функции обучения и оценки модели:
const createNetwork = require('../models/neuralNetwork');

function trainNetwork(data) {
    const network = createNetwork();
    data.forEach(sample => {
        network.train(sample.input, sample.output);
    });
    return network;
}

function evaluateNetwork(network, testData) {
    return testData.map(sample => ({
        input: sample.input,
        predicted: network.predict(sample.input),
        actual: sample.output
    }));
}

module.exports = { trainNetwork, evaluateNetwork };

Разделение логики слоёв

Каждый слой нейронной сети лучше оформлять как отдельный класс с методами:

  • forward(input) — прямое распространение сигнала;
  • backward(error) — обратное распространение ошибки;
  • updateWeights() — корректировка весов после обучения.

Пример реализации слоя:

const { Neuron } = require('mind');

class CustomLayer {
    constructor(size, activation) {
        this.neurons = Array.from({ length: size }, () => new Neuron(activation));
    }

    forward(inputs) {
        return this.neurons.map(neuron => neuron.activate(inputs));
    }

    backward(errors) {
        this.neurons.forEach((neuron, i) => neuron.propagate(errors[i]));
    }

    updateWeights(learningRate) {
        this.neurons.forEach(neuron => neuron.update(learningRate));
    }
}

module.exports = CustomLayer;

Управление данными

Для работы с сетью требуется разделение данных на тренировочные и тестовые наборы. Используется отдельный модуль data/dataHandler.js:

function splitData(dataset, testRatio = 0.2) {
    const shuffled = dataset.sort(() => 0.5 - Math.random());
    const testSize = Math.floor(dataset.length * testRatio);
    return {
        train: shuffled.slice(0, dataset.length - testSize),
        test: shuffled.slice(dataset.length - testSize)
    };
}

function normalizeData(dataset) {
    return dataset.map(sample => ({
        input: sample.input.map(x => x / 255),
        output: sample.output
    }));
}

module.exports = { splitData, normalizeData };

Логирование и отслеживание процесса

Для крупных проектов важно вести журнал обучения сети. Создается модуль utils/logger.js:

function logTraining(epoch, loss) {
    console.log(`Эпоха ${epoch}: потеря = ${loss.toFixed(4)}`);
}

function logEvaluation(results) {
    results.forEach((res, index) => {
        console.log(`Пример ${index + 1}: предсказано = ${res.predicted}, фактически = ${res.actual}`);
    });
}

module.exports = { logTraining, logEvaluation };

Интеграция и модульное тестирование

  • Каждый модуль сети тестируется отдельно: слои, функции активации, обработка данных.
  • Для тестирования используется Jest или Mocha с изоляцией нейронной сети через мок-данные.
  • Функции forward и backward проверяются на корректность вычислений градиентов.

Организация файлов и директорий

Пример оптимальной структуры:

/project-root
├─ config/
│  └─ network.js
├─ models/
│  └─ neuralNetwork.js
├─ layers/
│  └─ customLayer.js
├─ train/
│  └─ trainNetwork.js
├─ data/
│  └─ dataHandler.js
├─ utils/
│  └─ logger.js
├─ tests/
│  ├─ layers.test.js
│  └─ network.test.js
└─ index.js

Такое разделение упрощает поддержку кода, масштабирование проекта и повторное использование компонентов.