Keras 3 API文档 / 层API / 层权重约束器

层权重约束

约束的使用

keras.constraints 模块中的类允许在训练期间对模型参数设置约束(例如,非负约束)。它们是在每次梯度更新后(使用 fit() 时)应用于目标变量的每变量投影函数。

确切的API将取决于层,但 DenseConv1DConv2DConv3D 层具有统一的API。

这些层公开了两个关键字参数:

  • kernel_constraint 用于主权重矩阵。
  • bias_constraint 用于偏置。
from keras.constraints import max_norm
model.add(Dense(64, kernel_constraint=max_norm(2.)))

可用的权重约束

[源代码]

Constraint

keras.constraints.Constraint()

权重约束的基类。

Constraint 实例的作用类似于无状态函数。继承此类用户应覆盖 __call__() 方法,该方法接受一个权重参数并返回该参数的投影版本(例如,归一化或裁剪)。可以通过 kernel_constraintbias_constraint 参数将约束与各种 Keras 层一起使用。

这是一个简单的非负权重约束示例。

>>> class NonNegative(keras.constraints.Constraint):
...
...  def __call__(self, w):
...    return w * ops.cast(ops.greater_equal(w, 0.), dtype=w.dtype)
>>> weight = ops.convert_to_tensor((-1.0, 1.0))
>>> NonNegative()(weight)
[0.,  1.]

在层中的使用

>>> keras.layers.Dense(4, kernel_constraint=NonNegative())

[源代码]

MaxNorm

keras.constraints.MaxNorm(max_value=2, axis=0)

MaxNorm 权重约束。

将每个隐藏单元的传入权重约束为范数小于或等于指定值。

也可以通过快捷函数 keras.constraints.max_norm 获得。

参数

  • max_value:传入权重的最大范数值。
  • axis:整数,用于计算权重范数的轴。例如,在 Dense 层中,权重矩阵的形状为 (input_dim, output_dim),将 axis 设置为 0 可以约束长度为 (input_dim,) 的每个权重向量。在具有 data_format="channels_last"Conv2D 层中,权重张量的形状为 (rows, cols, input_depth, output_depth),将 axis 设置为 [0, 1, 2] 可以约束每个大小为 (rows, cols, input_depth) 的滤波器张量的权重。

[源代码]

MinMaxNorm

keras.constraints.MinMaxNorm(min_value=0.0, max_value=1.0, rate=1.0, axis=0)

MinMaxNorm 权重约束。

将每个隐藏单元的传入权重约束为范数介于下界和上界之间。

参数

  • min_value:传入权重的最小范数。
  • max_value:传入权重的最大范数。
  • rate:强制执行约束的速率:权重将被缩放,以产生 (1 - rate) * norm + rate * norm.clip(min_value, max_value)。实际上,这意味着 rate=1.0 表示严格执行约束,而 rate<1.0 表示权重将在每一步被缩放,以缓慢地移向所需区间内的值。
  • axis:整数,用于计算权重范数的轴。例如,在 Dense 层中,权重矩阵的形状为 (input_dim, output_dim),将 axis 设置为 0 可以约束长度为 (input_dim,) 的每个权重向量。在具有 data_format="channels_last"Conv2D 层中,权重张量的形状为 (rows, cols, input_depth, output_depth),将 axis 设置为 [0, 1, 2] 可以约束每个大小为 (rows, cols, input_depth) 的滤波器张量的权重。

[源代码]

NonNeg

keras.constraints.NonNeg()

将权重约束为非负。


[源代码]

UnitNorm

keras.constraints.UnitNorm(axis=0)

将每个隐藏单元的传入权重约束为单位范数。

参数

  • axis:整数,用于计算权重范数的轴。例如,在 Dense 层中,权重矩阵的形状为 (input_dim, output_dim),将 axis 设置为 0 可以约束长度为 (input_dim,) 的每个权重向量。在具有 data_format="channels_last"Conv2D 层中,权重张量的形状为 (rows, cols, input_depth, output_depth),将 axis 设置为 [0, 1, 2] 可以约束每个大小为 (rows, cols, input_depth) 的滤波器张量的权重。

创建自定义权重约束

权重约束可以是任何接受张量并返回具有相同形状和 dtype 的张量的可调用对象。您通常会将约束实现为 keras.constraints.Constraint 的子类。

这是一个简单的例子:一个约束,它强制权重张量平均围绕特定值居中。

from keras import ops

class CenterAround(keras.constraints.Constraint):
  """Constrains weight tensors to be centered around `ref_value`."""

  def __init__(self, ref_value):
    self.ref_value = ref_value

  def __call__(self, w):
    mean = ops.mean(w)
    return w - mean + self.ref_value

  def get_config(self):
    return {'ref_value': self.ref_value}

选项:您还可以实现 get_config 方法和类方法 from_config 以支持序列化 — 就像任何 Keras 对象一样。请注意,在上面的示例中,我们不必实现 from_config,因为类构造函数的参数与 get_config 返回的配置中的键相同。在这种情况下,默认的 from_config 可以正常工作。