keras.constraints
模块中的类允许在训练期间对模型参数设置约束(例如非负性)。它们是每次梯度更新后(使用 fit()
时)应用于目标变量的每变量投影函数。
具体的 API 将取决于层,但 Dense
、Conv1D
、Conv2D
和 Conv3D
层具有统一的 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_constraint
或 bias_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)
最大范数权重约束。
将每个隐藏单元的入射权重约束为小于或等于所需值的范数。
也可通过快捷函数 keras.constraints.max_norm
获取。
参数
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)
最小最大范数权重约束。
将每个隐藏单元的入射权重约束为范数在下限和上限之间。
参数
(1 - rate) * norm + rate * norm.clip(min_value, max_value)
。实际上,这意味着 rate=1.0 表示严格强制约束,而 rate<1.0 意味着权重将在每一步重新缩放,以缓慢地向所需区间内的值移动。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)
将每个隐藏单元的入射权重约束为单位范数。
参数
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)
的每个滤波器张量的权重。权重约束可以是任何可调用对象,它接受一个张量并返回具有相同形状和数据类型的张量。您通常会将约束实现为 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
也能正常工作。