Keras 3 API 文档 / 层 API / 层权重正则化器

层权重正则化器

正则化器允许你在优化期间对层参数或层激活施加惩罚。这些惩罚被累加到网络优化的损失函数中。

正则化惩罚按层应用。具体的 API 取决于层,但许多层(例如 DenseConv1DConv2DConv3D)具有统一的 API。

这些层公开 3 个关键字参数

  • kernel_regularizer:用于对层核施加惩罚的正则化器
  • bias_regularizer:用于对层偏置项施加惩罚的正则化器
  • activity_regularizer:用于对层输出施加惩罚的正则化器
from keras import layers
from keras import regularizers

layer = layers.Dense(
    units=64,
    kernel_regularizer=regularizers.L1L2(l1=1e-5, l2=1e-4),
    bias_regularizer=regularizers.L2(1e-4),
    activity_regularizer=regularizers.L2(1e-5)
)

activity_regularizer 对象返回的值会除以输入批次大小,以便权重正则化器和激活正则化器之间的相对权重不会随批次大小而改变。

在输入上调用该层之后,你可以通过调用 layer.losses 来访问该层的正则化惩罚。

from keras import ops

layer = layers.Dense(units=5,
                     kernel_initializer='ones',
                     kernel_regularizer=regularizers.L1(0.01),
                     activity_regularizer=regularizers.L2(0.01))
tensor = ops.ones(shape=(5, 5)) * 2.0
out = layer(tensor)
# The kernel regularization term is 0.25
# The activity regularization term (after dividing by the batch size) is 5
print(ops.sum(layer.losses))  # 5.25 (= 5 + 0.25)

可用正则化器

以下内置正则化器是 keras.regularizers 模块的一部分

[源码]

Regularizer

keras.regularizers.Regularizer()

正则化器基类。

正则化器允许你在优化期间对层参数或层激活施加惩罚。这些惩罚被累加到网络优化的损失函数中。

正则化惩罚按层应用。具体的 API 取决于层,但许多层(例如 DenseConv1DConv2DConv3D)具有统一的 API。

这些层公开 3 个关键字参数

  • kernel_regularizer:用于对层核施加惩罚的正则化器
  • bias_regularizer:用于对层偏置项施加惩罚的正则化器
  • activity_regularizer:用于对层输出施加惩罚的正则化器

所有层(包括自定义层)都公开 activity_regularizer 作为可设置属性,无论它是否在构造函数参数中。

activity_regularizer 返回的值会除以输入批次大小,以便权重正则化器和激活正则化器之间的相对权重不会随批次大小而改变。

在输入上调用该层之后,你可以通过调用 layer.losses 来访问该层的正则化惩罚。

示例

>>> layer = Dense(
...     5, input_dim=5,
...     kernel_initializer='ones',
...     kernel_regularizer=L1(0.01),
...     activity_regularizer=L2(0.01))
>>> tensor = ops.ones(shape=(5, 5)) * 2.0
>>> out = layer(tensor)
>>> # The kernel regularization term is 0.25
>>> # The activity regularization term (after dividing by the batch size)
>>> # is 5
>>> ops.sum(layer.losses)
5.25

可用惩罚

L1(0.3)  # L1 Regularization Penalty
L2(0.1)  # L2 Regularization Penalty
L1L2(l1=0.01, l2=0.01)  # L1 + L2 penalties

直接调用正则化器

通过直接调用正则化器(如同它是一个接受一个参数的函数),计算一个张量上的正则化损失。

例如:

>>> regularizer = L2(2.)
>>> tensor = ops.ones(shape=(5, 5))
>>> regularizer(tensor)
50.0

开发新的正则化器

任何接受权重矩阵并返回一个标量张量的函数都可以用作正则化器,例如:

>>> def l1_reg(weight_matrix):
...    return 0.01 * ops.sum(ops.absolute(weight_matrix))
...
>>> layer = Dense(5, input_dim=5,
...     kernel_initializer='ones', kernel_regularizer=l1_reg)
>>> tensor = ops.ones(shape=(5, 5))
>>> out = layer(tensor)
>>> layer.losses
0.25

或者,你可以通过继承这个正则化器基类来以面向对象的方式编写自定义正则化器,例如:

>>> class L2Regularizer(Regularizer):
...   def __init__(self, l2=0.):
...     self.l2 = l2
...
...   def __call__(self, x):
...     return self.l2 * ops.sum(ops.square(x))
...
...   def get_config(self):
...     return {'l2': float(self.l2)}
...
>>> layer = Dense(
...   5, input_dim=5, kernel_initializer='ones',
...   kernel_regularizer=L2Regularizer(l2=0.5))
>>> tensor = ops.ones(shape=(5, 5))
>>> out = layer(tensor)
>>> layer.losses
12.5

关于序列化和反序列化的注意事项

如果你只是训练和执行模型、导出到 SavedModels 和从 SavedModels 导入,或者保存和加载权重检查点,将正则化器注册为可序列化是可选的。

注册是必需的,以便将模型保存和加载到 HDF5 格式、Keras 模型克隆、一些可视化工具函数以及导出模型到 JSON 和从 JSON 导入。如果使用此功能,你必须确保任何运行你的模型的 Python 进程也已定义并注册了你的自定义正则化器。


[源码]

L1

keras.regularizers.L1(l1=0.01)

一个应用 L1 正则化惩罚的正则化器。

L1 正则化惩罚计算如下:loss = l1 * reduce_sum(abs(x))

L1 可以作为一个字符串标识符传递给层

>>> dense = Dense(3, kernel_regularizer='l1')

在这种情况下,使用的默认值是 l1=0.01

参数

  • l1:浮点数,L1 正则化因子。

[源码]

L2

keras.regularizers.L2(l2=0.01)

一个应用 L2 正则化惩罚的正则化器。

L2 正则化惩罚计算如下:loss = l2 * reduce_sum(square(x))

L2 可以作为一个字符串标识符传递给层

>>> dense = Dense(3, kernel_regularizer='l2')

在这种情况下,使用的默认值是 l2=0.01

参数

  • l2:浮点数,L2 正则化因子。

[源码]

L1L2

keras.regularizers.L1L2(l1=0.0, l2=0.0)

一个同时应用 L1 和 L2 正则化惩罚的正则化器。

L1 正则化惩罚计算如下:loss = l1 * reduce_sum(abs(x))

L2 正则化惩罚计算如下:loss = l2 * reduce_sum(square(x))

L1L2 可以作为一个字符串标识符传递给层

>>> dense = Dense(3, kernel_regularizer='l1_l2')

在这种情况下,使用的默认值是 l1=0.01l2=0.01

参数

  • l1:浮点数,L1 正则化因子。
  • l2:浮点数,L2 正则化因子。

[源码]

OrthogonalRegularizer

keras.regularizers.OrthogonalRegularizer(factor=0.01, mode="rows")

鼓励输入向量彼此正交的正则化器。

可以应用于矩阵的行(mode="rows")或列(mode="columns")。当应用于形状为 (input_dim, units)Dense 层核时,行模式将试图使特征向量(即输出空间的基)彼此正交。

参数

  • factor:浮点数。正则化因子。正则化惩罚将与 factor 乘以输入经过 L2 归一化后的行(如果 mode="rows")或列(如果 mode="columns")之间的点积平均值成比例,其中不包含每行/列与自身进行的乘积。默认为 0.01
  • mode:字符串,为 {"rows", "columns"} 之一。默认为 "rows"。在行模式下,正则化效果试图使输入的行彼此正交。在列模式下,它试图使输入的列彼此正交。

示例

>>> regularizer = OrthogonalRegularizer(factor=0.01)
>>> layer = Dense(units=4, kernel_regularizer=regularizer)

创建自定义正则化器

简单可调用对象

权重正则化器可以是任何可调用对象,它接受一个权重张量(例如 Conv2D 层的核)作为输入,并返回一个标量损失。如下所示:

def my_regularizer(x):
    return 1e-3 * ops.sum(ops.square(x))

Regularizer 子类

如果你需要通过各种参数(例如 l1_l2 中的 l1l2 参数)配置你的正则化器,你应该将其实现为 keras.regularizers.Regularizer 的子类。

下面是一个简单的示例:

class MyRegularizer(regularizers.Regularizer):

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

    def __call__(self, x):
        return self.strength * ops.sum(ops.square(x))

可选地,你还可以实现方法 get_config 和类方法 from_config 以便支持序列化——就像任何 Keras 对象一样。示例:

class MyRegularizer(regularizers.Regularizer):

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

    def __call__(self, x):
        return self.strength * ops.sum(ops.square(x))

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