Плотный слой, или Dense, является фундаментальным
строительным блоком большинства нейронных сетей. Он реализует обычный
полносвязный слой, где каждый нейрон предыдущего слоя соединён с каждым
нейроном текущего. В TensorFlow.js плотные слои предоставляются через
класс tf.layers.dense.
units: количество нейронов в слое. Определяет размерность выходного тензора.
activation: функция активации, применяемая к выходу слоя. Популярные варианты:
'relu' — Rectified Linear Unit, ускоряет сходимость в
глубоких сетях.'sigmoid' — вывод в диапазоне [0,1], часто используется
для бинарной классификации.'softmax' — нормализует выход в вероятности,
применяется в задачах многоклассовой классификации.useBias: логическое значение, указывающее,
добавлять ли смещение (bias) к каждому нейрону. По умолчанию
true.
kernelInitializer и
biasInitializer: задают способ инициализации весов и
смещений. Например, 'glorotUniform' или
'zeros'.
kernelRegularizer и biasRegularizer: регуляризация весов и смещений для предотвращения переобучения.
Пример создания слоя:
const denseLayer = tf.layers.dense({
units: 64,
activation: 'relu',
useBias: true,
kernelInitializer: 'glorotUniform',
biasInitializer: 'zeros'
});
Плотный слой принимает на вход тензор любой формы, кроме первой
размерности, которая обычно соответствует размеру батча. Например, если
входной тензор имеет форму [batchSize, inputDim], а
units=32, выходной тензор будет иметь форму
[batchSize, 32].
При последовательной передаче данных в модели:
const model = tf.sequential();
model.add(tf.layers.dense({inputShape: [100], units: 50, activation: 'relu'}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
inputShape указывается только для первого слоя.ReLU (Rectified Linear Unit):
f(x) = max(0, x)Sigmoid:
f(x) = 1 / (1 + exp(-x))Softmax:
n элементов в вероятностное
распределение.Инициализация весов имеет ключевое значение для сходимости сети:
Пример инициализации:
tf.layers.dense({
units: 128,
activation: 'relu',
kernelInitializer: 'heNormal'
});
Регуляризация помогает предотвращать переобучение, добавляя штраф за слишком большие веса:
tf.layers.dense({
units: 64,
kernelRegularizer: tf.regularizers.l2({l2: 0.01})
});
Слой можно использовать как функциональный блок вне модели:
const input = tf.tensor2d([[1, 2, 3, 4]], [1, 4]);
const dense = tf.layers.dense({units: 3, activation: 'relu'});
const output = dense.apply(input);
output.print();
apply возвращает новый тензор, вычисленный на
основе входа.Dense слои часто комбинируются с:
Пример комбинации:
const model = tf.sequential();
model.add(tf.layers.conv2d({
inputShape: [28, 28, 1],
filters: 32,
kernelSize: 3,
activation: 'relu'
}));
model.add(tf.layers.flatten());
model.add(tf.layers.dense({units: 128, activation: 'relu'}));
model.add(tf.layers.dropout({rate: 0.5}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
setWeights и получения через getWeights.tf.Sequential и
функциональным API (tf.model).Плотные слои остаются основным инструментом для построения классификаторов, регрессоров и многослойных нейронных сетей, обеспечивая прямое и гибкое управление связями между нейронами.