Определение архитектуры сети вручную

ml5.js предоставляет высокоуровневый интерфейс для работы с машинным обучением на JavaScript, основанный на TensorFlow.js. Одной из ключевых возможностей является настройка и определение архитектуры нейронной сети вручную для задач классификации, регрессии, генерации и других.

Создание нейронной сети с кастомной архитектурой

Для ручного определения архитектуры используется класс ml5.neuralNetwork. При его создании можно задавать тип задачи, структуру входов и выходов, а также гиперпараметры обучения. Пример базовой конфигурации:

const options = {
  task: 'classification', // или 'regression'
  debug: true
};
const nn = ml5.neuralNetwork(options);

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

Добавление слоев вручную

Метод addLayer позволяет детально настроить каждый слой:

nn.addLayer({
  type: 'dense',
  units: 64,
  activation: 'relu'
});
nn.addLayer({
  type: 'dense',
  units: 32,
  activation: 'relu'
});
nn.addLayer({
  type: 'dense',
  units: 10,
  activation: 'softmax'
});
  • type: тип слоя, чаще всего 'dense' для полносвязных слоев. Также поддерживаются conv2d, lstm и другие.
  • units: количество нейронов в слое.
  • activation: функция активации. Популярные функции — 'relu', 'sigmoid', 'tanh', 'softmax'.

Особенность ml5.js: слои добавляются в порядке их включения, поэтому порядок имеет критическое значение.

Настройка параметров обучения

При создании сети можно задать гиперпараметры обучения через метод train:

const trainingOptions = {
  epochs: 50,
  batchSize: 32,
  learningRate: 0.01
};
nn.train(trainingData, trainingOptions, whileTraining, finishedTraining);
  • epochs: количество проходов по всему набору данных.
  • batchSize: размер мини-батча для обновления весов.
  • learningRate: скорость обучения, важна для сходимости сети.
  • whileTraining: функция обратного вызова, вызываемая на каждой эпохе, для отслеживания прогресса.
  • finishedTraining: функция, выполняемая после завершения обучения.

Настройка входов и выходов

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

nn.addData({input1: 0.5, input2: 0.2}, {label: 'class1'});
  • Входные данные могут быть числовыми, массивами или объектами с несколькими признаками.
  • Выходные данные соответствуют количеству нейронов последнего слоя. Для классификации с 3 классами последний слой должен содержать 3 нейрона с функцией softmax.

Использование готовых функций активации и инициализации

ml5.js автоматически применяет стандартную инициализацию весов для плотных слоев, но при ручной настройке можно экспериментировать с различными функциями активации для каждого слоя. Например:

  • relu — эффективна для скрытых слоев, ускоряет обучение.
  • sigmoid — подходит для выхода в диапазоне [0,1].
  • softmax — необходима для многоклассовой классификации.

Применение регуляризации и оптимизаторов

В ml5.js можно задавать оптимизаторы и параметры регуляризации через TensorFlow.js:

const options = {
  optimizer: 'adam',
  learningRate: 0.001,
  loss: 'categoricalCrossentropy'
};
  • Оптимизатор 'adam' подходит для большинства задач.
  • Потери (loss) должны соответствовать типу задачи: 'categoricalCrossentropy' для многоклассовой классификации, 'meanSquaredError' для регрессии.

Сохранение и загрузка кастомной сети

После обучения сети можно сохранить её структуру и веса для последующего использования:

nn.save('myCustomNetwork');

Загрузка происходит через:

ml5.neuralNetwork({task: 'classification'}, 'myCustomNetwork/model.json')
  .then(nn => {
    // Сеть готова к предсказаниям
  });

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

Применение сети для предсказаний

После обучения и сохранения архитектуры сеть используется для предсказаний методом predict:

nn.predict({input1: 0.6, input2: 0.1}, (err, results) => {
  console.log(results);
});
  • results содержит массив объектов с вероятностями для каждого класса или значениями регрессии.
  • Поддерживаются как синхронные, так и асинхронные вызовы через промисы.

Рекомендации при ручной архитектуре

  1. Сначала проектировать входной и выходной слои, затем настраивать скрытые.
  2. Не перегружать сеть нейронами — ml5.js оптимизирован для небольших сетей на браузере.
  3. Отслеживать прогресс обучения через whileTraining для выявления переобучения.
  4. Тестировать разные функции активации для скрытых слоев для улучшения сходимости.
  5. Использовать нормализацию данных перед подачей в сеть для повышения стабильности обучения.

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