核心层 #

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