正则化器允许您在优化期间对层参数或层活动施加惩罚。这些惩罚将被累加到网络优化的损失函数中。
正则化惩罚是基于每一层施加的。确切的API将取决于层,但许多层(例如Dense
、Conv1D
、Conv2D
和Conv3D
)都具有统一的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)
# 核正则化项是 0.25
# 活动正则化项(除以批次大小后)是 5
print(ops.sum(layer.losses)) # 5.25 (= 5 + 0.25)
以下内置正则化器可作为keras.regularizers
模块的一部分使用:
Regularizer
classkeras.regularizers.Regularizer()
正则化器基类.
正则化器允许你在优化过程中对层参数或层活动应用惩罚.这些惩罚会被累加到网络优化的损失函数中.
正则化惩罚是按层应用的.具体的API将取决于层,但许多层(例如Dense
、Conv1D
、Conv2D
和Conv3D
)有一个统一的API.
这些层暴露了3个关键字参数:
kernel_regularizer
:对层的内核应用惩罚的正则化器bias_regularizer
:对层的偏置应用惩罚的正则化器activity_regularizer
:对层的输出应用惩罚的正则化器所有层(包括自定义层)都暴露activity_regularizer
作为可设置属性,无论它是否在构造函数参数中.
activity_regularizer
返回的值除以输入批次大小,以使权重正则化器和活动正则化器之间的相对权重不会随批次大小而变化.
你可以通过在输入上调用层后调用layer.losses
来访问层的正则化惩罚.
```python
>>> 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)
>>> # 内核正则化项为0.25
>>> # 活动正则化项(除以批次大小后)为5
>>> ops.sum(layer.losses)
5.25
## 可用惩罚
```python
L1(0.3) # L1正则化惩罚
L2(0.1) # L2正则化惩罚
L1L2(l1=0.01, l2=0.01) # L1 + L2惩罚
通过直接调用正则化器作为单参数函数来计算张量的正则化损失.
例如:
```python
>>> regularizer = L2(2.)
>>> tensor = ops.ones(shape=(5, 5))
>>> regularizer(tensor)
50.0
## 开发新的正则化器
任何接受权重矩阵并返回标量张量的函数都可以用作正则化器,例如:
```python
```python
>>> 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
或者,你可以通过扩展这个正则化器基类以面向对象的方式编写自定义正则化器,例如:
```python
```python
>>> 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进程也定义并注册了你的自定义正则化器.
----
<span style="float:right;">[[source]](https://github.com/keras-team/keras/tree/v3.5.0/keras/src/regularizers/regularizers.py#L194)</span>
### `L1` class
```python
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: float, L1正则化因子.
L2
classkeras.regularizers.L2(l2=0.01)
一个应用L2正则化惩罚的正则化器.
计算L2正则化惩罚的方式为:
loss = l2 * reduce_sum(square(x))
L2可以作为字符串标识符传递给一个层:
>>> dense = Dense(3, kernel_regularizer='l2')
在这种情况下,使用的默认值为l2=0.01
.
参数: l2: float, L2正则化因子.
L1L2
classkeras.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
.
参数: l1: float, L1正则化因子. l2: float, L2正则化因子.
OrthogonalRegularizer
classkeras.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
参数在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}