Функциональный API предоставляет гибкий способ построения нейронных
сетей, позволяя определять сложные архитектуры с несколькими входами,
выходами и разветвлениями. В отличие от последовательного
(Sequential) подхода, здесь модель строится как граф, где
слои соединяются через тензоры, а не линейно.
Для создания входа используется объект Input. Основные
параметры:
shape — форма одного входного примера без учета
размерности пакета (batch size).name — необязательное имя для слоя, полезное при работе
с несколькими входами.Пример:
const { Input } = require('keras-js');
const inputA = new Input({ shape: [64], name: 'inputA' });
const inputB = new Input({ shape: [32], name: 'inputB' });
Input возвращает тензор, который используется как
аргумент для последующих слоев.
Каждый слой можно вызвать как функцию над тензором:
const { Dense } = require('keras-js');
const denseA = new Dense({ units: 128, activation: 'relu' }).apply(inputA);
const denseB = new Dense({ units: 64, activation: 'relu' }).apply(inputB);
apply() создает новый тензор, представляющий выход слоя,
который можно использовать дальше.
Функциональный API позволяет строить сложные графы, объединяя несколько ветвей:
Пример объединения ветвей:
const { Concatenate } = require('keras-js');
const merged = new Concatenate().apply([denseA, denseB]);
После объединения можно добавить последующие слои:
const output = new Dense({ units: 10, activation: 'softmax' }).apply(merged);
Функциональный API поддерживает модели с несколькими выходами. Для этого просто определяются несколько тензоров-выходов:
const output1 = new Dense({ units: 5, activation: 'softmax', name: 'out1' }).apply(merged);
const output2 = new Dense({ units: 1, activation: 'sigmoid', name: 'out2' }).apply(denseB);
Модель создается с указанием входов и выходов:
const { Model } = require('keras-js');
const model = new Model({
inputs: [inputA, inputB],
outputs: [output1, output2]
});
Такое определение позволяет Keras.js корректно вычислять граф и выполнять обратное распространение ошибки для всех ветвей.
После создания модель можно компилировать и использовать для прогнозирования:
model.compile({
optimizer: 'adam',
loss: { out1: 'categoricalCrossentropy', out2: 'binaryCrossentropy' },
metrics: ['accuracy']
});
const xA = ...; // данные для inputA
const xB = ...; // данные для inputB
const yPred = model.predict([xA, xB]);
Функциональный API позволяет:
Функциональный API превращает построение нейронных сетей в работу с графами данных, где каждый слой является узлом, а тензоры — рёбрами, соединяющими эти узлы. Такой подход открывает возможности для создания архитектур, которые невозможно реализовать последовательно.