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()
方法中實例化。
使用者只需實例化一個層,然後將其視為可呼叫的。
參數
keras.DTypePolicy
,它允許計算和權重 dtype 不同。預設為 None
。None
表示使用 keras.config.dtype_policy()
,除非設定為不同的值(透過 keras.config.set_dtype_policy()
),否則它是 float32
策略。屬性
layer.variable_dtype
的別名。keras.DTypePolicy
一起使用時,這將與 variable_dtype
不同。layer.trainable_weights
的一部分返回。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)
,如果層需要,使用者可以選擇性地新增 training
和 mask
。get_config(self)
:返回包含用於初始化此層的配置的字典。如果鍵與 __init__()
中的參數不同,則也覆寫 from_config(self)
。當儲存層或包含此層的模型時,會使用此方法。範例
這是一個基本範例:一個具有兩個變數 w
和 b
的層,它返回 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,
)
向層新增權重變數。
參數
None
條目)。如果未指定,則預設為 ()
(純量)。"random_normal"
)。如果未指定,則浮點變數預設為 "glorot_uniform"
,而所有其他類型(例如 int、bool)預設為 "zeros"
。"float32"
。如果未指定,則預設為層的變數 dtype(如果未指定,則預設為 "float32"
)。True
。True
。None
。None
。None
、"none"
、"mean"
、"sum"
或 "only_first_replica"
之一。以自訂資料平行訓練迴圈時用於此變數的多副本聚合類型來註釋變數。預設為 "none"
。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
、正規化器和子層的純量損失清單。