Keras 3 API 文件 / 層 API / 基礎 Layer 類別

基礎 Layer 類別

[原始碼]

Layer 類別

keras.layers.Layer(
    activity_regularizer=None,
    trainable=True,
    dtype=None,
    autocast=True,
    name=None,
    **kwargs
)

這是所有層繼承的類別。

層是一個可呼叫的物件,它將一個或多個張量作為輸入,並輸出一個或多個張量。它包含在 call() 方法中定義的計算,以及一個狀態(權重變數)。狀態可以在以下位置建立

  • __init__() 中,例如透過 self.add_weight()
  • 在可選的 build() 方法中,該方法由對層的第一個 __call__() 呼叫,並提供輸入的形狀,這些形狀在初始化時可能未知。

層是遞迴可組合的:如果您將一個 Layer 實例指定為另一個 Layer 的屬性,則外部層將開始追蹤內部層建立的權重。巢狀層應在 __init__() 方法或 build() 方法中實例化。

使用者只需實例化一個層,然後將其視為可呼叫的。

參數

  • trainable:布林值,表示層的變數是否應該可訓練。
  • name:層的字串名稱。
  • dtype:層的計算和權重的 dtype。也可以是 keras.DTypePolicy,它允許計算和權重 dtype 不同。預設為 NoneNone 表示使用 keras.config.dtype_policy(),除非設定為不同的值(透過 keras.config.set_dtype_policy()),否則它是 float32 策略。

屬性

  • name:層的名稱(字串)。
  • dtype:層權重的 dtype。layer.variable_dtype 的別名。
  • variable_dtype:層權重的 dtype。
  • compute_dtype:層計算的 dtype。層自動將輸入轉換為此 dtype,這會導致計算和輸出也採用此 dtype。當混合精度與 keras.DTypePolicy 一起使用時,這將與 variable_dtype 不同。
  • trainable_weights:要包含在反向傳播中的變數清單。
  • non_trainable_weights:不應包含在反向傳播中的變數清單。
  • weights:可訓練權重清單和不可訓練權重清單的串聯(按此順序)。
  • trainable:層是否應該被訓練(布林值),也就是說,它潛在可訓練的權重是否應該作為 layer.trainable_weights 的一部分返回。
  • input_spec:可選的 InputSpec 物件(或物件清單),指定層可接受的輸入上的約束。

我們建議 Layer 的後代實作以下方法

  • __init__():定義自訂層屬性,並建立不依賴於輸入形狀的層權重,使用 add_weight() 或其他狀態。
  • build(self, input_shape):此方法可用於建立依賴於輸入形狀的權重,使用 add_weight() 或其他狀態。__call__() 將透過呼叫 build() 自動建立層(如果尚未建立)。
  • call(self, *args, **kwargs):在確保呼叫 build() 後在 __call__ 中呼叫。call() 執行將層應用於輸入參數的邏輯。您可以在 call() 中選擇性地使用兩個保留的關鍵字參數:1. training(布林值,表示呼叫是在推論模式還是在訓練模式)。2. mask(布林張量,編碼輸入中遮罩的時間步長,例如在 RNN 層中使用)。此方法的典型簽名是 call(self, inputs),如果層需要,使用者可以選擇性地新增 trainingmask
  • get_config(self):返回包含用於初始化此層的配置的字典。如果鍵與 __init__() 中的參數不同,則也覆寫 from_config(self)。當儲存層或包含此層的模型時,會使用此方法。

範例

這是一個基本範例:一個具有兩個變數 wb 的層,它返回 y = w . x + b。它展示了如何實作 build()call()。設定為層屬性的變數會被追蹤為層的權重(在 layer.weights 中)。

class SimpleDense(Layer):
    def __init__(self, units=32):
        super().__init__()
        self.units = units

    # Create the state of the layer (weights)
    def build(self, input_shape):
        self.kernel = self.add_weight(
            shape=(input_shape[-1], self.units),
            initializer="glorot_uniform",
            trainable=True,
            name="kernel",
        )
        self.bias = self.add_weight(
            shape=(self.units,),
            initializer="zeros",
            trainable=True,
            name="bias",
        )

    # Defines the computation
    def call(self, inputs):
        return ops.matmul(inputs, self.kernel) + self.bias

# Instantiates the layer.
linear_layer = SimpleDense(4)

# This will also call `build(input_shape)` and create the weights.
y = linear_layer(ops.ones((2, 2)))
assert len(linear_layer.weights) == 2

# These weights are trainable, so they're listed in `trainable_weights`:
assert len(linear_layer.trainable_weights) == 2

除了在訓練期間透過反向傳播更新的可訓練權重之外,層還可以具有不可訓練的權重。這些權重旨在在 call() 期間手動更新。這是一個計算其輸入執行總和的範例層

class ComputeSum(Layer):

  def __init__(self, input_dim):
      super(ComputeSum, self).__init__()
      # Create a non-trainable weight.
      self.total = self.add_weight(
        shape=(),
        initializer="zeros",
        trainable=False,
        name="total",
      )

  def call(self, inputs):
      self.total.assign(self.total + ops.sum(inputs))
      return self.total

my_sum = ComputeSum(2)
x = ops.ones((2, 2))
y = my_sum(x)

assert my_sum.weights == [my_sum.total]
assert my_sum.non_trainable_weights == [my_sum.total]
assert my_sum.trainable_weights == []

weights 屬性

keras.layers.Layer.weights

層的所有權重變數的清單。

layer.variables 不同,這不包括度量狀態和隨機種子。


trainable_weights 屬性

keras.layers.Layer.trainable_weights

層的所有可訓練權重變數的清單。

這些是在訓練期間由最佳化器更新的權重。


non_trainable_weights 屬性

keras.layers.Layer.non_trainable_weights

層的所有不可訓練權重變數的清單。

這些是不應在訓練期間由最佳化器更新的權重。與 layer.non_trainable_variables 不同,這不包括度量狀態和隨機種子。


[原始碼]

add_weight 方法

Layer.add_weight(
    shape=None,
    initializer=None,
    dtype=None,
    trainable=True,
    autocast=True,
    regularizer=None,
    constraint=None,
    aggregation="none",
    name=None,
)

向層新增權重變數。

參數

  • shape:變數的形狀元組。必須完全定義(沒有 None 條目)。如果未指定,則預設為 ()(純量)。
  • initializer:用於填入初始變數值的初始化器物件,或內建初始化器的字串名稱(例如 "random_normal")。如果未指定,則浮點變數預設為 "glorot_uniform",而所有其他類型(例如 int、bool)預設為 "zeros"
  • dtype:要建立的變數的 dtype,例如 "float32"。如果未指定,則預設為層的變數 dtype(如果未指定,則預設為 "float32")。
  • trainable:布林值,表示變數是否應該透過反向傳播進行訓練,或者其更新是否手動管理。預設為 True
  • autocast:布林值,表示存取層變數時是否自動轉換。預設為 True
  • regularizer:正規化器物件,用於呼叫以對權重施加懲罰。這些懲罰在最佳化期間會加總到損失函數中。預設為 None
  • constraint:在任何最佳化器更新後對變數呼叫的約束物件,或內建約束的字串名稱。預設為 None
  • aggregation:可選字串,為 None"none""mean""sum""only_first_replica" 之一。以自訂資料平行訓練迴圈時用於此變數的多副本聚合類型來註釋變數。預設為 "none"
  • name:變數的字串名稱。對於除錯很有用。

trainable 屬性

keras.layers.Layer.trainable

可設定的布林值,表示此層是否應該可訓練。


[原始碼]

get_weights 方法

Layer.get_weights()

以 NumPy 陣列清單的形式返回 layer.weights 的值。


[原始碼]

set_weights 方法

Layer.set_weights(weights)

從 NumPy 陣列清單設定 layer.weights 的值。


[原始碼]

get_config 方法

Model.get_config()

返回物件的配置。

物件配置是一個 Python 字典(可序列化),其中包含重新實例化它所需的信息。


[原始碼]

add_loss 方法

Layer.add_loss(loss)

可以在 call() 方法內呼叫,以新增純量損失。

範例

class MyLayer(Layer):
    ...
    def call(self, x):
        self.add_loss(ops.sum(x))
        return x

losses 屬性

keras.layers.Layer.losses

來自 add_loss、正規化器和子層的純量損失清單。