Концепция слоёв и модели

TensorFlow.js предоставляет мощный инструментарий для построения нейронных сетей прямо в среде JavaScript. Основой любой модели является концепция слоёв, которые объединяются в последовательности для выполнения сложных вычислений.


Слои (Layers)

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

  • Размерность входа (inputShape) — определяет структуру данных, подаваемых на слой.
  • Количество нейронов (units) — задаёт количество выходных элементов.
  • Функция активации (activation) — применяет нелинейную трансформацию, например relu, sigmoid или softmax.

Пример создания плотного (Dense) слоя в TensorFlow.js:

const tf = require('@tensorflow/tfjs');

const layer = tf.layers.dense({
  units: 128,
  activation: 'relu',
  inputShape: [64]
});

Плотный слой полностью соединён с предыдущим, что позволяет модели эффективно извлекать признаки. Для работы с изображениями чаще используют слои свёртки (conv2d) и пулинга (maxPooling2d), которые обеспечивают пространственное сокращение и выделение локальных признаков.


Последовательность слоёв (Sequential)

Модель Sequential представляет собой линейную цепочку слоёв, где выход одного слоя становится входом следующего. Это самый простой способ организации нейронной сети.

const model = tf.sequential({
  layers: [
    tf.layers.dense({units: 64, activation: 'relu', inputShape: [100]}),
    tf.layers.dense({units: 10, activation: 'softmax'})
  ]
});

Преимущество Sequential заключается в простоте: модель строится сверху вниз без необходимости вручную соединять слои. Ограничение — невозможность реализовать сложные графы с разветвлениями или множественными входами и выходами.


Компиляция модели

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

model.compile({
  optimizer: 'adam',
  loss: 'categoricalCrossentropy',
  metrics: ['accuracy']
});
  • Оптимизатор отвечает за корректировку весов на каждом шаге обучения.
  • Функция потерь измеряет разницу между предсказанием модели и реальными данными.
  • Метрики позволяют отслеживать прогресс обучения, например точность (accuracy).

Обучение модели

Обучение выполняется с помощью метода fit, который принимает данные, количество эпох и размер батча:

await model.fit(xTrain, yTrain, {
  epochs: 50,
  batchSize: 32,
  validationSplit: 0.2
});
  • epochs — число проходов по всему набору данных.
  • batchSize — количество примеров, обрабатываемых за одну итерацию.
  • validationSplit — доля данных для проверки, чтобы контролировать переобучение.

Сложные модели с функциональным API

Функциональный API позволяет создавать модели с множественными входами и выходами, а также сложными топологиями:

const input = tf.input({shape: [64]});
const hidden = tf.layers.dense({units: 128, activation: 'relu'}).apply(input);
const output = tf.layers.dense({units: 10, activation: 'softmax'}).apply(hidden);

const complexModel = tf.model({inputs: input, outputs: output});

Функциональный подход необходим при построении сетей с ветвлениями, skip-connections или при интеграции нескольких источников данных.


Сохранение и загрузка моделей

TensorFlow.js позволяет сохранять модели как на локальном диске, так и в браузере. Форматы включают JSON для структуры модели и бинарные веса:

await model.save('localstorage://my-model');
const loadedModel = await tf.loadLayersModel('localstorage://my-model');

Это упрощает перенос обученных моделей между средами и повторное использование без переобучения.


Основные принципы работы с слоями

  1. Каждый слой выполняет детерминированное преобразование входных данных.
  2. Активация добавляет нелинейность, необходимую для обучения сложных зависимостей.
  3. Модели строятся как последовательность или граф слоёв, что определяет их способность обрабатывать различные типы данных.
  4. Плотные слои хорошо подходят для табличных данных, свёрточные — для изображений, рекуррентные — для последовательностей.
  5. Компиляция и обучение модели требуют тщательного выбора оптимизатора и функции потерь для стабильной сходимости.

Взаимодействие слоёв и тензоров

Каждый слой получает тензор на входе и возвращает тензор на выходе. Размерности тензоров должны согласовываться с параметрами слоя. Например, слой Dense с units=10 преобразует входной тензор [batchSize, inputDim] в [batchSize, 10]. Понимание правил согласования размерностей критично для построения корректной модели.


Поддержка браузера и Node.js

TensorFlow.js работает как в браузере, так и в Node.js. Отличие заключается в способах загрузки данных и использовании аппаратного ускорения:

  • Browser — WebGL для GPU-вычислений.
  • Node.js — может использовать TensorFlow C++ backend для высокой производительности.

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