Functional API в TensorFlow.js предоставляет гибкий способ построения нейронных сетей, позволяя определять сложные архитектуры с ветвлениями, многовходовыми и многовыходными моделями, что невозможно или неудобно реализовать с помощью Sequential API. В отличие от последовательной модели, где слои добавляются один за другим, функциональный подход строит граф вычислений напрямую, соединяя слои с помощью входов и выходов.
В функциональном API модель начинается с определения Input Layer. Этот слой не выполняет вычислений, но задаёт форму данных, которые будут поступать на вход модели.
import * as tf from '@tensorflow/tfjs';
const input = tf.input({shape: [28, 28, 1]});
Пояснение параметров:
shape: массив, задающий форму входного тензора, без
учёта размера батча.name (опционально): имя слоя, полезно для отладки и
визуализации модели.После создания входного слоя можно подключать к нему другие слои, используя вызовы функций. Каждый слой возвращает тензор, который затем может быть передан следующему слою.
import {layers} from '@tensorflow/tfjs';
const x = layers.conv2d({filters: 32, kernelSize: 3, activation: 'relu'}).apply(input);
const y = layers.maxPooling2d({poolSize: 2, strides: 2}).apply(x);
const z = layers.flatten().apply(y);
const output = layers.dense({units: 10, activation: 'softmax'}).apply(z);
Особенности:
apply используется для передачи данных между
слоями.Модель функционального API строится через указание входов и выходов.
const model = tf.model({inputs: input, outputs: output});
После создания модели можно её компилировать и обучать так же, как последовательную модель:
model.compile({
optimizer: 'adam',
loss: 'categoricalCrossentropy',
metrics: ['accuracy']
});
Функциональный API позволяет строить модели с несколькими входами и выходами, что особенно полезно для комплексных задач, например, мультимодальных данных.
const inputA = tf.input({shape: [32]});
const inputB = tf.input({shape: [32]});
const denseA = layers.dense({units: 64, activation: 'relu'}).apply(inputA);
const denseB = layers.dense({units: 64, activation: 'relu'}).apply(inputB);
const concatenated = layers.concatenate().apply([denseA, denseB]);
const outputMulti = layers.dense({units: 10, activation: 'softmax'}).apply(concatenated);
const multiInputModel = tf.model({inputs: [inputA, inputB], outputs: outputMulti});
Для построения сложных моделей используется функция
concatenate для объединения и add для сложения
слоёв.
const branch1 = layers.dense({units: 32, activation: 'relu'}).apply(input);
const branch2 = layers.dense({units: 32, activation: 'relu'}).apply(input);
const merged = layers.concatenate().apply([branch1, branch2]);
const finalOutput = layers.dense({units: 1, activation: 'sigmoid'}).apply(merged);
const complexModel = tf.model({inputs: input, outputs: finalOutput});
Замечание: функциональный API позволяет строить как параллельные, так и последовательные ветви, объединяя их любым доступным способом (сложение, конкатенация, умножение).
TensorFlow.js поддерживает создание собственных слоёв через
наследование класса tf.layers.Layer. Это особенно важно для
функционального API, так как новые слои можно интегрировать в сложный
граф:
class MyCustomLayer extends tf.layers.Layer {
constructor(config) {
super(config);
}
computeOutputShape(inputShape) {
return inputShape;
}
call(input) {
return tf.add(input, tf.scalar(1));
}
}
const customOutput = new MyCustomLayer().apply(input);
const customModel = tf.model({inputs: input, outputs: customOutput});
Функциональная модель не зависит от конкретного формата данных. Можно
использовать tf.data или обычные массивы JavaScript,
преобразуя их в тензоры.
const xs = tf.tensor2d([[0.1, 0.2], [0.2, 0.3]]);
const ys = tf.tensor2d([[1, 0], [0, 1]]);
model.fit(xs, ys, {epochs: 10, batchSize: 2});
TensorFlow.js позволяет визуализировать граф функциональной модели
через model.summary():
model.summary();
Вывод отображает структуру слоёв, количество параметров и связи между ними, что удобно для отладки сложных архитектур.
Функциональный API в TensorFlow.js открывает возможности для реализации современных сетевых архитектур, гибко управляя потоком данных между слоями, создавая ветвления и объединяя несколько входов и выходов. Такой подход идеально подходит для сложных приложений компьютерного зрения, обработки последовательностей и мультимодальных данных.