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),將 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 權重約束。

約束入射到每個隱藏單元的權重,使其範數介於下限和上限之間。

參數

  • 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),將 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)

約束入射到每個隱藏單元的權重,使其具有單位範數。

參數

  • axis:整數,計算權重範數的軸。例如,在 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 可以正常運作。