來自 keras.constraints
模組的類別允許在訓練期間設定模型參數的約束(例如,非負性)。它們是每個變數的投影函數,在每次梯度更新後(當使用 fit()
時)應用於目標變數。
確切的 API 將取決於層,但 Dense
、Conv1D
、Conv2D
和 Conv3D
層具有統一的 API。
這些層公開了兩個關鍵字引數
kernel_constraint
用於主要權重矩陣bias_constraint
用於偏置。from keras.constraints import max_norm
model.add(Dense(64, kernel_constraint=max_norm(2.)))
Constraint
類別keras.constraints.Constraint()
權重約束的基礎類別。
Constraint
實例就像一個無狀態函數。繼承此類別的使用者應覆寫 __call__()
方法,該方法接受單個權重參數並返回該參數的投影版本(例如,正規化或裁剪)。約束可以通過 kernel_constraint
或 bias_constraint
引數與各種 Keras 層一起使用。
以下是非負權重約束的簡單範例
>>> class NonNegative(keras.constraints.Constraint):
...
... def __call__(self, w):
... return w * ops.cast(ops.greater_equal(w, 0.), dtype=w.dtype)
>>> weight = ops.convert_to_tensor((-1.0, 1.0))
>>> NonNegative()(weight)
[0., 1.]
在層中的使用
>>> keras.layers.Dense(4, kernel_constraint=NonNegative())
MaxNorm
類別keras.constraints.MaxNorm(max_value=2, axis=0)
MaxNorm 權重約束。
將每個隱藏單元的權重限制為小於或等於所需的值。
也可以通過快捷方式函數 keras.constraints.max_norm
取得。
引數
Dense
層中,權重矩陣的形狀為 (input_dim, output_dim)
,設定 axis
為 0
以約束每個長度為 (input_dim,)
的權重向量。在具有 data_format="channels_last"
的 Conv2D
層中,權重張量的形狀為 (rows, cols, input_depth, output_depth)
,設定 axis
為 [0, 1, 2]
以約束每個大小為 (rows, cols, input_depth)
的濾波器張量的權重。MinMaxNorm
類別keras.constraints.MinMaxNorm(min_value=0.0, max_value=1.0, rate=1.0, axis=0)
MinMaxNorm 權重約束。
將每個隱藏單元的權重限制為介於下限和上限之間的範數。
引數
(1 - rate) * norm + rate * norm.clip(min_value, max_value)
。實際上,這表示 rate=1.0 代表嚴格強制執行約束,而 rate<1.0 表示權重將在每個步驟重新縮放,以慢慢移向所需間隔內的值。Dense
層中,權重矩陣的形狀為 (input_dim, output_dim)
,設定 axis
為 0
以約束每個長度為 (input_dim,)
的權重向量。在具有 data_format="channels_last"
的 Conv2D
層中,權重張量的形狀為 (rows, cols, input_depth, output_depth)
,設定 axis
為 [0, 1, 2]
以約束每個大小為 (rows, cols, input_depth)
的濾波器張量的權重。NonNeg
類別keras.constraints.NonNeg()
將權重限制為非負數。
UnitNorm
類別keras.constraints.UnitNorm(axis=0)
將每個隱藏單元的權重限制為單位範數。
引數
Dense
層中,權重矩陣的形狀為 (input_dim, output_dim)
,設定 axis
為 0
以約束每個長度為 (input_dim,)
的權重向量。在具有 data_format="channels_last"
的 Conv2D
層中,權重張量的形狀為 (rows, cols, input_depth, output_depth)
,設定 axis
為 [0, 1, 2]
以約束每個大小為 (rows, cols, input_depth)
的濾波器張量的權重。權重約束可以是任何接受張量並返回具有相同形狀和 dtype 的張量的可呼叫物件。您通常會將約束實作為 keras.constraints.Constraint
的子類別。
以下是一個簡單的範例:一個強制權重張量平均集中在特定值附近的約束。
from keras import ops
class CenterAround(keras.constraints.Constraint):
"""Constrains weight tensors to be centered around `ref_value`."""
def __init__(self, ref_value):
self.ref_value = ref_value
def __call__(self, w):
mean = ops.mean(w)
return w - mean + self.ref_value
def get_config(self):
return {'ref_value': self.ref_value}
(可選)您還可以實作方法 get_config
和類別方法 from_config
以支援序列化,就像任何 Keras 物件一樣。請注意,我們不必在上面的範例中實作 from_config
,因為類別的建構函式引數是 get_config
返回的組態中的鍵。在這種情況下,預設的 from_config
正常運作。