核心层 #
Dense 层(全连接层) #
Dense 层是最基础的神经网络层,实现 output = activation(dot(input, kernel) + bias)。
text
┌─────────────────────────────────────────────────────────────┐
│ Dense 层结构 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 输入 (n 维) 输出 (m 维) │
│ ┌───┐ ┌───┐ │
│ │ x1│ ──────────────────►│ y1│ │
│ ├───┤ 权重矩阵 ├───┤ │
│ │ x2│ ──────────────────►│ y2│ │
│ ├───┤ W (n×m) ├───┤ │
│ │ x3│ ──────────────────►│ y3│ │
│ └───┘ 偏置 b └───┘ │
│ │
│ 参数数量: n × m + m │
│ │
│ 例: Dense(64, input_shape=(32,)) │
│ 参数: 32 × 64 + 64 = 2112 │
│ │
└─────────────────────────────────────────────────────────────┘
基本用法 #
python
import keras
model = keras.Sequential([
keras.layers.Dense(64, activation='relu', input_shape=(784,)),
keras.layers.Dense(32, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
参数详解 #
python
keras.layers.Dense(
units=64,
activation='relu',
use_bias=True,
kernel_initializer='glorot_uniform',
bias_initializer='zeros',
kernel_regularizer=None,
bias_regularizer=None,
activity_regularizer=None,
kernel_constraint=None,
bias_constraint=None
)
text
┌─────────────────────────────────────────────────────────────┐
│ Dense 参数说明 │
├─────────────────────────────────────────────────────────────┤
│ │
│ units: 输出维度(必须指定) │
│ │
│ activation: 激活函数 │
│ ├── 'relu': ReLU 激活 │
│ ├── 'sigmoid': Sigmoid 激活 │
│ ├── 'softmax': Softmax 激活 │
│ └── None: 线性激活(无激活) │
│ │
│ use_bias: 是否使用偏置 │
│ │
│ kernel_initializer: 权重初始化方法 │
│ ├── 'glorot_uniform' (默认): Xavier 均匀分布 │
│ ├── 'he_normal': He 正态分布 │
│ └── 'lecun_normal': LeCun 正态分布 │
│ │
│ kernel_regularizer: 权重正则化 │
│ ├── l1: L1 正则化 │
│ ├── l2: L2 正则化 │
│ └── l1_l2: L1+L2 正则化 │
│ │
└─────────────────────────────────────────────────────────────┘
正则化示例 #
python
import keras
model = keras.Sequential([
keras.layers.Dense(
64,
activation='relu',
kernel_regularizer=keras.regularizers.L2(0.01),
bias_regularizer=keras.regularizers.L2(0.01)
),
keras.layers.Dense(10, activation='softmax')
])
Dropout 层 #
Dropout 在训练时随机将部分神经元输出设为 0,防止过拟合。
text
┌─────────────────────────────────────────────────────────────┐
│ Dropout 原理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 训练时: │
│ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ │
│ │ 1 │ 2 │ 3 │ 4 │ ───► │ 1 │ 0 │ 3 │ 0 │ │
│ └───┴───┴───┴───┘ └───┴───┴───┴───┘ │
│ 随机丢弃 rate 比例 │
│ │
│ 推理时: │
│ 所有神经元都参与,输出乘以 (1 - rate) │
│ │
│ 效果: │
│ ├── 防止神经元过度依赖特定特征 │
│ ├── 相当于训练多个子网络的集成 │
│ └── 提高模型泛化能力 │
│ │
└─────────────────────────────────────────────────────────────┘
基本用法 #
python
import keras
model = keras.Sequential([
keras.layers.Dense(512, activation='relu', input_shape=(784,)),
keras.layers.Dropout(0.5),
keras.layers.Dense(256, activation='relu'),
keras.layers.Dropout(0.3),
keras.layers.Dense(10, activation='softmax')
])
参数详解 #
python
keras.layers.Dropout(
rate=0.5,
noise_shape=None,
seed=None
)
不同位置的 Dropout #
python
import keras
inputs = keras.Input(shape=(784,))
x = keras.layers.Dense(512, activation='relu')(inputs)
x = keras.layers.Dropout(0.5)(x)
x = keras.layers.Dense(256, activation='relu')(x)
x = keras.layers.Dropout(0.3)(x)
outputs = keras.layers.Dense(10, activation='softmax')(x)
model = keras.Model(inputs, outputs)
BatchNormalization 层 #
批归一化对每个小批量数据进行归一化,加速训练并提高稳定性。
text
┌─────────────────────────────────────────────────────────────┐
│ BatchNormalization 原理 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 输入: x (batch_size, features) │
│ │
│ 步骤: │
│ 1. 计算批次均值: μ = mean(x, axis=0) │
│ 2. 计算批次方差: σ² = var(x, axis=0) │
│ 3. 归一化: x̂ = (x - μ) / √(σ² + ε) │
│ 4. 缩放平移: y = γ × x̂ + β │
│ │
│ 可学习参数: │
│ ├── γ (gamma): 缩放因子 │
│ └── β (beta): 平移因子 │
│ │
│ 优点: │
│ ├── 加速收敛 │
│ ├── 允许更大学习率 │
│ ├── 减少对初始化的敏感 │
│ └── 轻微正则化效果 │
│ │
└─────────────────────────────────────────────────────────────┘
基本用法 #
python
import keras
model = keras.Sequential([
keras.layers.Dense(512, input_shape=(784,)),
keras.layers.BatchNormalization(),
keras.layers.Activation('relu'),
keras.layers.Dropout(0.3),
keras.layers.Dense(256),
keras.layers.BatchNormalization(),
keras.layers.Activation('relu'),
keras.layers.Dense(10, activation='softmax')
])
CNN 中的 BatchNormalization #
python
import keras
model = keras.Sequential([
keras.layers.Conv2D(64, 3, padding='same', input_shape=(32, 32, 3)),
keras.layers.BatchNormalization(),
keras.layers.Activation('relu'),
keras.layers.Conv2D(64, 3, padding='same'),
keras.layers.BatchNormalization(),
keras.layers.Activation('relu'),
keras.layers.MaxPooling2D(),
keras.layers.Flatten(),
keras.layers.Dense(10, activation='softmax')
])
Flatten 层 #
Flatten 将多维输入展平为一维。
python
import keras
model = keras.Sequential([
keras.layers.Conv2D(32, 3, input_shape=(28, 28, 1)),
keras.layers.MaxPooling2D(),
keras.layers.Flatten(),
keras.layers.Dense(128, activation='relu'),
keras.layers.Dense(10, activation='softmax')
])
text
┌─────────────────────────────────────────────────────────────┐
│ Flatten 操作 │
├─────────────────────────────────────────────────────────────┤
│ │
│ 输入形状: (batch, 28, 28, 32) │
│ │
│ 展平后: (batch, 28 × 28 × 32) = (batch, 25088) │
│ │
│ ┌─────────────────┐ ┌───────────────────────┐ │
│ │ 28 × 28 × 32 │ ───► │ 25088 │ │
│ │ 三维张量 │ │ 一维向量 │ │
│ └─────────────────┘ └───────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
Reshape 层 #
Reshape 将输入重塑为指定形状。
python
import keras
model = keras.Sequential([
keras.layers.Flatten(input_shape=(28, 28)),
keras.layers.Dense(784),
keras.layers.Reshape((28, 28)),
keras.layers.Conv2D(32, 3, padding='same')
])
Input 层 #
Input 层用于指定模型的输入形状。
python
import keras
inputs = keras.Input(shape=(784,), name='input')
x = keras.layers.Dense(64, activation='relu')(inputs)
outputs = keras.layers.Dense(10, activation='softmax')(x)
model = keras.Model(inputs=inputs, outputs=outputs)
Activation 层 #
Activation 层应用激活函数。
python
import keras
model = keras.Sequential([
keras.layers.Dense(64, input_shape=(784,)),
keras.layers.Activation('relu'),
keras.layers.Dense(10),
keras.layers.Activation('softmax')
])
ActivityRegularization 层 #
ActivityRegularization 对层输出应用正则化。
python
import keras
model = keras.Sequential([
keras.layers.Dense(64, input_shape=(784,)),
keras.layers.ActivityRegularization(l1=0.01, l2=0.01),
keras.layers.Dense(10, activation='softmax')
])
Masking 层 #
Masking 用于处理变长序列,跳过填充值。
python
import keras
model = keras.Sequential([
keras.layers.Masking(mask_value=0.0, input_shape=(None, 10)),
keras.layers.LSTM(32),
keras.layers.Dense(1, activation='sigmoid')
])
完整示例 #
python
import keras
model = keras.Sequential([
keras.layers.Input(shape=(784,)),
keras.layers.Dense(512),
keras.layers.BatchNormalization(),
keras.layers.Activation('relu'),
keras.layers.Dropout(0.3),
keras.layers.Dense(256),
keras.layers.BatchNormalization(),
keras.layers.Activation('relu'),
keras.layers.Dropout(0.3),
keras.layers.Dense(128),
keras.layers.BatchNormalization(),
keras.layers.Activation('relu'),
keras.layers.Dropout(0.2),
keras.layers.Dense(10, activation='softmax')
])
model.compile(
optimizer=keras.optimizers.Adam(learning_rate=0.001),
loss='sparse_categorical_crossentropy',
metrics=['accuracy']
)
model.summary()
下一步 #
现在你已经掌握了核心层,接下来学习 卷积层,处理图像数据!
最后更新:2026-04-04