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,或儲存和載入權重檢查點,則將正規化器註冊為可序列化是可選的。

將模型儲存和載入為 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

引數

  • 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 子類別

如果您需要透過各種引數(例如 l1l2 引數在 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}