Keras 3 API 文档 / 层 API / 基础 Layer 类

基础 Layer 类

[源代码]

Layer

keras.layers.Layer(
    activity_regularizer=None,
    trainable=True,
    dtype=None,
    autocast=True,
    name=None,
    **kwargs
)

所有层的基类。

层是一个可调用对象,它接受一个或多个张量作为输入,并输出一个或多个张量。它包含计算(在 call() 方法中定义)和状态(权重变量)。状态可以在以下位置创建

  • __init__() 中,例如通过 self.add_weight()
  • 在可选的 build() 方法中,该方法由层的首次 __call__() 调用,并提供输入形状,这些形状在初始化时可能未知。

层是递归可组合的:如果您将 Layer 实例分配为另一个 Layer 的属性,则外部层将开始跟踪内部层创建的权重。嵌套层应在 __init__() 方法或 build() 方法中实例化。

用户只需实例化一个层,然后将其视为可调用对象。

参数

  • trainable: 布尔值,指示层的变量是否应可训练。
  • name: 层的字符串名称。
  • dtype: 层计算和权重的 dtype。也可以是 keras.DTypePolicy,它允许计算和权重 dtype 不同。默认为 NoneNone 表示使用 keras.config.dtype_policy(),这是一个 float32 策略,除非设置为不同的值(通过 keras.config.set_dtype_policy())。

属性

  • name: 层的名称(字符串)。
  • dtype: 层权重的 Dtype。layer.variable_dtype 的别名。
  • variable_dtype: 层权重的 Dtype。
  • compute_dtype: 层计算的 dtype。层会自动将输入强制转换为此 dtype,这会导致计算和输出也采用此 dtype。当混合精度与 keras.DTypePolicy 一起使用时,这将与 variable_dtype 不同。
  • trainable_weights: 要包含在反向传播中的变量列表。
  • non_trainable_weights: 不应包含在反向传播中的变量列表。
  • weights: trainable_weights 和 non_trainable_weights 列表的串联(按此顺序)。
  • trainable: 指示层是否应被训练(布尔值),即其潜在可训练的权重是否应作为 layer.trainable_weights 的一部分返回。
  • input_spec: 可选的(InputSpec 对象)列表,指定层可以接受的输入的约束。

我们建议 Layer 的子类实现以下方法

  • __init__(): 定义自定义层属性,并创建不依赖于输入形状的层权重,使用 add_weight() 或其他状态。
  • build(self, input_shape): 此方法可用于创建依赖于输入形状的权重,使用 add_weight() 或其他状态。__call__() 将自动构建层(如果尚未构建),方法是调用 build()
  • call(self, *args, **kwargs): 在 __call__ 中调用,以确保已调用 build()call() 执行将层应用于输入参数的逻辑。您可以在 call() 中可选使用的两个保留关键字参数是:1. training(布尔值,指示调用是在推理模式还是训练模式下)。2. mask(布尔张量,编码输入中的掩码时间步,例如在 RNN 层中使用)。此方法的典型签名是 call(self, inputs),用户可以选择添加 trainingmask(如果层需要它们)。
  • get_config(self): 返回一个字典,其中包含用于初始化此层的配置。如果键与 __init__() 中的参数不同,则还需要重写 from_config(self)。在保存层或包含此层的模型时,将使用此方法。

示例

这是一个基本示例:具有两个变量 wb 的层,返回 y = w . x + b。它展示了如何实现 build()call()。设置为层属性的变量被跟踪为层的权重(在 layer.weights 中)。

class SimpleDense(Layer):
    def __init__(self, units=32):
        super().__init__()
        self.units = units

    # Create the state of the layer (weights)
    def build(self, input_shape):
        self.kernel = self.add_weight(
            shape=(input_shape[-1], self.units),
            initializer="glorot_uniform",
            trainable=True,
            name="kernel",
        )
        self.bias = self.add_weight(
            shape=(self.units,),
            initializer="zeros",
            trainable=True,
            name="bias",
        )

    # Defines the computation
    def call(self, inputs):
        return ops.matmul(inputs, self.kernel) + self.bias

# Instantiates the layer.
linear_layer = SimpleDense(4)

# This will also call `build(input_shape)` and create the weights.
y = linear_layer(ops.ones((2, 2)))
assert len(linear_layer.weights) == 2

# These weights are trainable, so they're listed in `trainable_weights`:
assert len(linear_layer.trainable_weights) == 2

除了在训练期间通过反向传播更新的可训练权重外,层还可以具有不可训练的权重。这些权重旨在在 call() 期间手动更新。这是一个计算其输入的运行总和的示例层

class ComputeSum(Layer):

  def __init__(self, input_dim):
      super(ComputeSum, self).__init__()
      # Create a non-trainable weight.
      self.total = self.add_weight(
        shape=(),
        initializer="zeros",
        trainable=False,
        name="total",
      )

  def call(self, inputs):
      self.total.assign(self.total + ops.sum(inputs))
      return self.total

my_sum = ComputeSum(2)
x = ops.ones((2, 2))
y = my_sum(x)

assert my_sum.weights == [my_sum.total]
assert my_sum.non_trainable_weights == [my_sum.total]
assert my_sum.trainable_weights == []

weights 属性

keras.layers.Layer.weights

层的所有权重变量的列表。

layer.variables 不同,这不包括指标状态和随机种子。


trainable_weights 属性

keras.layers.Layer.trainable_weights

层的所有可训练权重变量的列表。

这些是在训练期间由优化器更新的权重。


non_trainable_weights 属性

keras.layers.Layer.non_trainable_weights

层的所有不可训练权重变量的列表。

这些是不应在训练期间由优化器更新的权重。与 layer.non_trainable_variables 不同,这不包括指标状态和随机种子。


[源代码]

add_weight 方法

Layer.add_weight(
    shape=None,
    initializer=None,
    dtype=None,
    trainable=True,
    autocast=True,
    regularizer=None,
    constraint=None,
    aggregation="none",
    name=None,
)

向层添加权重变量。

参数

  • shape: 变量的形状元组。必须完全定义(没有 None 条目)。如果未指定,则默认为 ()(标量)。
  • initializer: 用于填充初始变量值的初始化器对象,或内置初始化器的字符串名称(例如 "random_normal")。如果未指定,则浮点变量默认为 "glorot_uniform",所有其他类型(例如 int、bool)默认为 "zeros"
  • dtype: 要创建的变量的 Dtype,例如 "float32"。如果未指定,则默认为层的变量 dtype(如果未指定,则默认为 "float32")。
  • trainable: 布尔值,指示变量是否应通过反向传播进行训练,或者其更新是否手动管理。默认为 True
  • autocast: 布尔值,指示在访问层变量时是否自动强制转换。默认为 True
  • regularizer: 正则化器对象,用于调用以对权重应用惩罚。这些惩罚在优化期间被求和到损失函数中。默认为 None
  • constraint: 约束对象,用于在任何优化器更新后调用变量,或内置约束的字符串名称。默认为 None
  • aggregation: 可选字符串,为 None"none""mean""sum""only_first_replica" 之一。使用多副本聚合类型注释变量,以便在编写自定义数据并行训练循环时使用此变量。默认为 "none"
  • name: 变量的字符串名称。用于调试目的。

trainable 属性

keras.layers.Layer.trainable

可设置的布尔值,指示此层是否应可训练。


[源代码]

get_weights 方法

Layer.get_weights()

layer.weights 的值作为 NumPy 数组列表返回。


[源代码]

set_weights 方法

Layer.set_weights(weights)

从 NumPy 数组列表设置 layer.weights 的值。


[源代码]

get_config 方法

Model.get_config()

返回对象的配置。

对象配置是一个 Python 字典(可序列化),其中包含重新实例化它所需的信息。


[源代码]

add_loss 方法

Layer.add_loss(loss)

可以在 call() 方法内部调用以添加标量损失。

示例

class MyLayer(Layer):
    ...
    def call(self, x):
        self.add_loss(ops.sum(x))
        return x

losses 属性

keras.layers.Layer.losses

来自 add_loss、正则化器和子层的标量损失列表。