Skip to content

Keras - Layers

层(Layer)是 Keras 模型(tf.keras.Model)的基本构建块。一个层本质上是一个数据处理模块,它接收输入张量(tensor),执行一些计算(通常涉及可学习权重),并返回输出张量。神经网络的架构就是通过这些层的连接方式来定义的。

大多数 Keras 层共享一些常用概念和配置参数:

  • 输入形状(input_shape): 对于 Sequential 模型中的第一层,或者在 Functional API 中定义一个 Input 层时,您需要指定输入数据的形状,不包括批次维度(batch dimension)。例如,对于 MNIST 图像(28x28 像素,1 个通道),使用 channels-last 格式时为 input_shape=(28, 28, 1)。对于展平的 MNIST(784 个特征),为 input_shape=(784,)。
  • 单元 / 过滤器(Units / Filters): 许多层(如 Dense、Conv2D、LSTM)都有一个主要参数,用于指定输出空间的维度(神经元/单元的数量或卷积过滤器的数量)。
  • 激活函数(activation): 指定在层的核心计算后应用的非线性函数。可以通过字符串名称(如 'relu'、'sigmoid'、'softmax')指定,也可以使用 tf.keras.activations 中的函数对象。
  • 权重初始化器(kernel_initializer、bias_initializer): 决定层在训练开始前如何初始化其权重(kernel)和偏置(bias)。良好的初始化有助于收敛。常用选择包括 'glorot_uniform'(Dense、Conv 的默认值)、'he_normal'、'zeros'、'ones'。由 tf.keras.initializers 提供。
  • 正则化器(kernel_regularizer、bias_regularizer、activity_regularizer): 在训练期间对权重、偏置或层激活应用惩罚,以防止过拟合。示例:tf.keras.regularizers.l1(0.01)、tf.keras.regularizers.l2(0.001)。
  • 约束(kernel_constraint、bias_constraint): 在优化过程中对权重强制执行约束(例如,使用 tf.keras.constraints.NonNeg() 强制非负)。不如正则化器常用。
  • 可学习参数(Learnable Parameters): 大多数层拥有内部变量(权重和偏置),它们在训练期间通过反向传播进行更新,以最小化损失函数。像 Dropout 或 Flatten 这样的层通常没有可学习参数。

示例:创建一个带有常用参数的 Dense 层:

import tensorflow as tf
dense_layer = tf.keras.layers.Dense(
units=64, # 这一层有 64 个神经元
activation='relu', # 应用 ReLU 激活函数
kernel_initializer='he_normal', # 使用 He normal 初始化权重
kernel_regularizer=tf.keras.regularizers.l2(0.01), # 应用 L2 正则化
input_shape=(784,) # 指定输入形状(如果是第一层)
)

tf.keras.layers 提供了各种各样的层类型。以下是一些关键类别:

  • Dense: 常规的全连接层。每个输入神经元连接到每个输出神经元。MLPs 的核心构建块。output = activation(dot(input, kernel) + bias)。
  • Activation: 将激活函数作为单独一层应用。
  • Dropout: 在训练期间的每次更新时,随机将一部分(rate)输入单元设置为 0。一种强大的防止过拟合的技术。
  • Flatten: 将输入张量展平为一维(不包括批次维度)。常用于从卷积/池化层过渡到 Dense 层。
  • Reshape: 将输入张量重塑为指定的形状。
  • Permute: 根据给定模式置换输入的维度。
  • RepeatVector: 将输入重复 n 次。
  • Lambda: 将任意表达式或函数包装为 Layer 对象。
  • InputLayer / Input: 用于实例化输入张量(主要用于 Functional API)。

2. 卷积层 (Convolutional Layers) (用于 CNNs)

Section titled “2. 卷积层 (Convolutional Layers) (用于 CNNs)”

专为网格状数据(如图像)设计。

  • Conv1D、Conv2D、Conv3D: 分别执行一维、二维或三维卷积。关键参数包括 filters(输出过滤器数量)、kernel_size(卷积窗口大小)、strides(步长)、padding('valid' 或 'same')。
  • SeparableConv2D: 深度可分离二维卷积。比标准的 Conv2D 更高效,用于 MobileNet 等模型。
  • DepthwiseConv2D: 深度二维卷积。
  • Conv2DTranspose (反卷积): 执行与卷积大致相反的操作,常用于生成模型或分割中的上采样。
  • UpSampling2D: 通过重复行和列来进行上采样。

3. 池化层 (Pooling Layers) (用于 CNNs)

Section titled “3. 池化层 (Pooling Layers) (用于 CNNs)”

减小特征图的空间维度,提供不变性并减少计算量。

  • MaxPooling1D、MaxPooling2D、MaxPooling3D: 在窗口内取最大值。
  • AveragePooling1D、AveragePooling2D、AveragePooling3D: 在窗口内取平均值。
  • GlobalMaxPooling2D、GlobalAveragePooling2D: 在整个空间维度上取最大值或平均值,为每个特征图产生一个单一值。常用于最终 Dense 层之前,替代 Flatten 层。

4. 循环层 (Recurrent Layers) (用于 RNNs)

Section titled “4. 循环层 (Recurrent Layers) (用于 RNNs)”

专为序列数据设计。

  • SimpleRNN: 基本全连接 RNN,其输出反馈到输入。
  • GRU (门控循环单元): 更复杂的 RNN,带有门控机制来控制信息流,通常性能与 LSTMs 相似但参数更少。
  • LSTM (长短期记忆网络): 高级 RNN,带有输入、遗忘和输出门,能够学习长距离依赖。
  • Bidirectional: 一个包装层,在输入序列上沿前向和后向应用 RNN(如 LSTM 或 GRU),并连接输出。通常通过提供来自过去和未来步骤的上下文来提高性能。

有助于稳定训练并改善收敛。

  • BatchNormalization: 跨当前批次对激活进行归一化。在 CNNs 中非常常用,应用于卷积/Dense 层之后和激活之前。
  • LayerNormalization: 跨特征维度对激活进行归一化。常用于 RNNs 和 Transformers。

直接在模型内部执行数据预处理,简化部署,因为预处理成为保存模型的一部分。

  • TextVectorization: 将原始文本转换为整数索引序列或 multi-hot 向量。
  • Normalization: 特征级归一化(从数据计算均值/方差)。
  • Resizing、Rescaling、CenterCrop: 图像变换。
  • CategoryEncoding: 将整数分类特征转换为 one-hot、multi-hot 或 TF-IDF 向量。

实现注意力机制,允许模型专注于输入序列的相关部分。Transformer 模型的核心组成部分。

  • Attention、AdditiveAttention (Bahdanau 风格): 基本注意力机制。
  • MultiHeadAttention: 在不同的“头”中并行执行注意力。Transformer 中的一个关键层。

深度学习的艺术在于选择合适的层并将它们排列成针对您的特定任务的有效架构。理解常用层的目的和参数是构建强大 Keras 模型的第一步。