正規化器讓您在最佳化期間對層參數或層活動施加懲罰。這些懲罰會加總到網路最佳化的損失函數中。
正規化懲罰是逐層應用的。確切的 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))
L1L2 正規化懲罰的計算方式為: loss = l1 * reduce_sum(abs(x)) + 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}