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

基础 Layer 类

[源代码]

Layer

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

所有层都继承自此类。

层是一个可调用对象,它接收一个或多个张量作为输入,并输出一个或多个张量。它涉及在 call() 方法中定义的计算和一个状态(权重变量)。状态可以在

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

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

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

参数

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

属性

  • 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):在确保已调用 build() 后,在 __call__ 中调用。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="mean",
    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:字符串,'mean''sum''only_first_replica' 之一。使用此变量编写自定义数据并行训练循环时,使用此变量注释变量的多副本聚合类型。
  • 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、正则化器和子层的标量损失列表。