Полносвязный слой Dense
Урок разбирает слой Dense — основной кирпич нейросетей: что он вычисляет и из чего состоит.
Dense (полносвязный) слой соединяет каждый вход с каждым нейроном и вычисляет
выход = активация(вход · веса + смещение).
Полносвязный слой — самый базовый и универсальный. Из стопки таких слоёв собирают сети для табличных данных, а в свёрточных сетях ими завершают классификацию. Понять Dense — значит понять, что вообще «учит» нейросеть.
Что вычисляет один нейрон
Нейрон берёт входы, умножает каждый на свой вес, складывает, прибавляет смещение и пропускает через активацию. Посчитаем один нейрон вручную на stdlib — код запускается:
import math
inputs = [0.5, -1.0, 2.0]
weights = [0.4, 0.2, -0.3]
bias = 0.1
z = sum(i * w for i, w in zip(inputs, weights)) + bias
# активация relu: max(0, z)
out = max(0.0, z)
print("взвешенная сумма z:", round(z, 3))
print("выход после relu:", round(out, 3))Вывод:
взвешенная сумма z: -0.5 выход после relu: 0.0
Здесь сумма получилась отрицательной, поэтому relu обнулила выход. Так нейрон «решает», активироваться ему или нет.
Зачем смещение (bias)
Смещение сдвигает порог активации. Без него граница решения всегда проходила бы через ноль, что сильно ограничивает сеть. Bias даёт каждому нейрону свободу «включаться» при нужном уровне сигнала.
Dense в Keras
В коде слой задаётся одной строкой (требует TF):
from tensorflow.keras import layers
# 64 нейрона, активация relu
layer = layers.Dense(units=64, activation="relu")
# выходной слой регрессии: 1 нейрон без активации
out = layers.Dense(units=1)Связь слоя и матриц
вход (1, 3) веса (3, 64) выход (1, 64)
[x1 x2 x3] · [ 3×64 матрица ] = [64 числа] (+ bias) -> активацияКак работает под капотом
Dense не считает нейроны по одному — он выполняет одно матричное умножение всего батча на матрицу весов и прибавляет вектор bias через broadcasting. Веса инициализируются случайными малыми числами (по умолчанию Glorot-инициализация), а затем обучение постепенно их подстраивает. Именно эти веса и смещения — то, что «знает» сеть.
Частые ошибки
- Ставить активацию на выходной слой регрессии. Для предсказания числа выход обычно без активации (линейный).
- Забывать про bias. Отключение смещения (
use_bias=False) без причины ослабляет модель. - Слишком большой первый слой. Огромный Dense на сырых пикселях даёт миллионы параметров и переобучение — для картинок лучше свёртки.
Итог
- Dense соединяет каждый вход с каждым нейроном:
активация(вход·веса + bias). - Bias сдвигает порог активации и важен для гибкости сети.
- Под капотом — одно матричное умножение батча на матрицу весов.
- Веса и смещения — это и есть то, что обучается.