正規化器允許您在最佳化期間對層參數或層活動施加懲罰。這些懲罰會加總到網路最佳化的損失函數中。
正規化懲罰是逐層套用的。確切的 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)
# 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
:對層的核施加懲罰的正規化器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,或儲存和載入權重檢查點,則將正規化器註冊為可序列化是可選的。
將模型儲存和載入為 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}