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.)))

可用的权重约束

[source]

Constraint class

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())

[source]

MaxNorm class

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

最大范数权重约束.

约束每个隐藏单元相关联的权重 使其范数小于或等于期望值.

也可以通过快捷函数 keras.constraints.max_norm 使用.

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


[source]

MinMaxNorm class

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

最小最大归一化权重约束.

约束每个隐藏单元的输入权重 使其范数在上下界之间.

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


[source]

NonNeg class

keras.constraints.NonNeg()

约束权重为非负.


[source]

UnitNorm class

keras.constraints.UnitNorm(axis=0)

约束每个隐藏单元的权重使其具有单位范数.

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


创建自定义权重约束

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

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

from keras import ops

class CenterAround(keras.constraints.Constraint):
  """约束权重张量围绕`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运行良好。