正则化器允许您在优化期间对层参数或层活动应用惩罚项。这些惩罚项会被加总到网络优化的损失函数中。
正则化惩罚项是逐层应用的。具体的 API 将取决于层,但许多层(例如 Dense
、Conv1D
、Conv2D
和 Conv3D
)具有统一的 API。
这些层公开了 3 个关键字参数
kernel_regularizer
:正则化器,用于对层的核(kernel)应用惩罚项bias_regularizer
:正则化器,用于对层的偏置(bias)应用惩罚项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 将取决于层,但许多层(例如 Dense
、Conv1D
、Conv2D
和 Conv3D
)具有统一的 API。
这些层公开了 3 个关键字参数
kernel_regularizer
:正则化器,用于对层的核(kernel)应用惩罚项bias_regularizer
:正则化器,用于对层的偏置(bias)应用惩罚项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,或者保存和加载权重检查点,则将正则化器注册为可序列化是可选的。
对于将模型保存和加载到 HDF5 格式、Keras 模型克隆、某些可视化实用程序以及将模型导出和导入到 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
。
参数
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
。
参数
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.01
和 l2=0.01
。
参数
OrthogonalRegularizer
类keras.regularizers.OrthogonalRegularizer(factor=0.01, mode="rows")
正则化器,鼓励输入向量彼此正交。
它可以应用于矩阵的行 (mode="rows"
) 或列 (mode="columns"
)。当应用于形状为 (input_dim, units)
的 Dense
核时,行模式将尝试使特征向量(即输出空间的基础)彼此正交。
参数
factor
乘以输入 L2 归一化行(如果 mode="rows"
,或列如果 mode="columns"
)之间的点积的平均值成正比,不包括每行/列与其自身的乘积。默认为 0.01
。{"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
参数在 l1_l2
中)配置正则化器,则应将其实现为 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}