Keras 3 API 文件 / 層 API / 層權重約束

層權重約束

約束的使用

來自 keras.constraints 模組的類別允許在訓練期間設定模型參數的約束(例如,非負性)。它們是每個變數的投影函數,在每次梯度更新後(當使用 fit() 時)應用於目標變數。

確切的 API 將取決於層,但 DenseConv1DConv2DConv3D 層具有統一的 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_constraintbias_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 取得。

引數

  • max_value:輸入權重的最大範數值。
  • axis:整數,計算權重範數的軸。例如,在 Dense 層中,權重矩陣的形狀為 (input_dim, output_dim),設定 axis0 以約束每個長度為 (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 權重約束。

將每個隱藏單元的權重限制為介於下限和上限之間的範數。

引數

  • min_value:輸入權重的最小範數。
  • max_value:輸入權重的最大範數。
  • rate:強制約束的比率:權重將重新縮放以產生 (1 - rate) * norm + rate * norm.clip(min_value, max_value)。實際上,這表示 rate=1.0 代表嚴格強制執行約束,而 rate<1.0 表示權重將在每個步驟重新縮放,以慢慢移向所需間隔內的值。
  • axis:整數,計算權重範數的軸。例如,在 Dense 層中,權重矩陣的形狀為 (input_dim, output_dim),設定 axis0 以約束每個長度為 (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)

將每個隱藏單元的權重限制為單位範數。

引數

  • axis:整數,計算權重範數的軸。例如,在 Dense 層中,權重矩陣的形狀為 (input_dim, output_dim),設定 axis0 以約束每個長度為 (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 正常運作。