這是所有層都繼承的類。
繼承自:Module
用法
tf.keras.layers.Layer(
trainable=True, name=None, dtype=None, dynamic=False, **kwargs
)
參數
-
trainable
布爾值,層的變量是否應該是可訓練的。 -
name
圖層的字符串名稱。 -
dtype
層的計算和權重的 dtype。也可以是tf.keras.mixed_precision.Policy
,它允許計算和權重 dtype 不同。None
默認值表示使用tf.keras.mixed_precision.global_policy()
,這是一個 float32 策略,除非設置為不同的值。 -
dynamic
如果您的層應該隻即刻地運行,並且不應該用於生成靜態計算圖,請將其設置為True
。例如,Tree-RNN 或遞歸網絡就是這種情況,或者通常是使用 Python 控製流來操縱張量的任何層。如果False
,我們假設該層可以安全地用於生成靜態計算圖。
屬性
-
name
圖層的名稱(字符串)。 -
dtype
圖層權重的 dtype。 -
variable_dtype
dtype
的別名。 -
compute_dtype
層計算的 dtype。層會自動將輸入轉換為此 dtype,這會導致計算和輸出也在此 dtype 中。當混合精度與tf.keras.mixed_precision.Policy
一起使用時,這將不同於variable_dtype
。 -
dtype_policy
圖層的 dtype 策略。有關詳細信息,請參閱tf.keras.mixed_precision.Policy
文檔。 -
trainable_weights
要包含在反向傳播中的變量列表。 -
non_trainable_weights
不應包含在反向傳播中的變量列表。 -
weights
列表 trainable_weights 和 non_trainable_weights 的串聯(按此順序)。 -
trainable
是否應訓練層(布爾值),即是否應將其 potentially-trainable 權重作為layer.trainable_weights
的一部分返回。 -
input_spec
可選(列表)InputSpec
對象,指定層可以接受的輸入約束。 -
activity_regularizer
該層輸出的可選正則化函數。 -
dynamic
圖層是否動態(eager-only);在構造函數中設置。 -
input
檢索層的輸入張量。僅當該層隻有一個輸入時才適用,即如果它連接到一個傳入層。
-
losses
使用添加的損失列表add_loss()
API。訪問此屬性時會創建變量正則化張量,因此非常安全:訪問
tf.GradientTape
下的losses
會將梯度傳播回相應的變量。class MyLayer(tf.keras.layers.Layer): def call(self, inputs): self.add_loss(tf.abs(tf.reduce_mean(inputs))) return inputs l = MyLayer() l(np.ones((10, 1))) l.losses [1.0]
inputs = tf.keras.Input(shape=(10,)) x = tf.keras.layers.Dense(10)(inputs) outputs = tf.keras.layers.Dense(1)(x) model = tf.keras.Model(inputs, outputs) # Activity regularization. len(model.losses) 0 model.add_loss(tf.abs(tf.reduce_mean(x))) len(model.losses) 1
inputs = tf.keras.Input(shape=(10,)) d = tf.keras.layers.Dense(10, kernel_initializer='ones') x = d(inputs) outputs = tf.keras.layers.Dense(1)(x) model = tf.keras.Model(inputs, outputs) # Weight regularization. model.add_loss(lambda:tf.reduce_mean(d.kernel)) model.losses [<tf.Tensor:shape=(), dtype=float32, numpy=1.0>]
-
metrics
使用添加的指標列表add_metric()
API。input = tf.keras.layers.Input(shape=(3,)) d = tf.keras.layers.Dense(2) output = d(input) d.add_metric(tf.reduce_max(output), name='max') d.add_metric(tf.reduce_min(output), name='min') [m.name for m in d.metrics] ['max', 'min']
-
output
檢索層的輸出張量。僅當該層隻有一個輸出時才適用,即如果它連接到一個傳入層。
-
supports_masking
該層是否支持使用compute_mask
計算掩碼。
層是一個可調用對象,它將一個或多個張量作為輸入,並輸出一個或多個張量。它涉及計算,定義在call()
方法和一個狀態(權重變量)。在子類實現者的方便下,可以在不同的地方創建狀態:
- 在
__init__()
中; - 在可選的
build()
方法中,該方法由第一個__call__()
調用到層,並提供在初始化時可能不知道的輸入的形狀; - 在
call()
的第一次調用中,下麵討論了一些注意事項。
用戶隻需實例化一個層,然後將其視為可調用的。
我們建議Layer
的後代實現以下方法:
__init__()
:定義自定義圖層屬性,並使用add_weight()
或其他狀態創建不依賴於輸入形狀的圖層權重。build(self, input_shape)
:此方法可用於創建取決於輸入形狀的權重,使用add_weight()
或其他狀態。__call__()
將通過調用build()
自動構建層(如果尚未構建)。call(self, inputs, *args, **kwargs)
: 調用__call__
確定後build()
已被調用。call()
執行將圖層應用於inputs
.第一次調用可能會另外創建無法方便地創建的狀態build()
;有關詳細信息,請參閱其文檔字符串。您可以選擇使用的兩個保留關鍵字參數call()
是:training
(布爾值,調用是處於推理模式還是訓練模式)。在層/模型子類化指南中查看更多詳細信息mask
(布爾張量編碼輸入中的掩碼時間步,用於 RNN 層)。在層/模型子類化指南中查看更多詳細信息此方法的典型簽名是call(self, inputs)
,如果層需要,用戶可以選擇添加training
和mask
。*args
和**kwargs
僅在計劃添加更多輸入參數時對將來的擴展有用。
- get_config(self):Returns a dictionary containing the configuration used to initialize this layer. If the keys differ from the arguments in __init__, then override from_config(self) as well. This method is used when saving the layer or a model that contains this layer.
例子:
這是一個基本示例:具有兩個變量 w
和 b
的層,返回 y = w . x + b
。它展示了如何實現 build()
和 call()
。設置為圖層屬性的變量將作為圖層的權重進行跟蹤(在 layer.weights
中)。
class SimpleDense(Layer):
def __init__(self, units=32):
super(SimpleDense, self).__init__()
self.units = units
def build(self, input_shape): # Create the state of the layer (weights)
w_init = tf.random_normal_initializer()
self.w = tf.Variable(
initial_value=w_init(shape=(input_shape[-1], self.units),
dtype='float32'),
trainable=True)
b_init = tf.zeros_initializer()
self.b = tf.Variable(
initial_value=b_init(shape=(self.units,), dtype='float32'),
trainable=True)
def call(self, inputs): # Defines the computation from inputs to outputs
return tf.matmul(inputs, self.w) + self.b
# Instantiates the layer.
linear_layer = SimpleDense(4)
# This will also call `build(input_shape)` and create the weights.
y = linear_layer(tf.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
請注意,add_weight()
方法提供了創建權重的快捷方式:
class SimpleDense(Layer):
def __init__(self, units=32):
super(SimpleDense, self).__init__()
self.units = units
def build(self, input_shape):
self.w = self.add_weight(shape=(input_shape[-1], self.units),
initializer='random_normal',
trainable=True)
self.b = self.add_weight(shape=(self.units,),
initializer='random_normal',
trainable=True)
def call(self, inputs):
return tf.matmul(inputs, self.w) + self.b
除了在訓練期間通過反向傳播更新的可訓練權重外,層還可以具有不可訓練的權重。這些權重應在 call()
期間手動更新。這是一個計算其輸入的運行總和的示例層:
class ComputeSum(Layer):
def __init__(self, input_dim):
super(ComputeSum, self).__init__()
# Create a non-trainable weight.
self.total = tf.Variable(initial_value=tf.zeros((input_dim,)),
trainable=False)
def call(self, inputs):
self.total.assign_add(tf.reduce_sum(inputs, axis=0))
return self.total
my_sum = ComputeSum(2)
x = tf.ones((2, 2))
y = my_sum(x)
print(y.numpy()) # [2. 2.]
y = my_sum(x)
print(y.numpy()) # [4. 4.]
assert my_sum.weights == [my_sum.total]
assert my_sum.non_trainable_weights == [my_sum.total]
assert my_sum.trainable_weights == []
有關創建層的更多信息,請參閱通過子類化創建新層和模型指南
相關用法
- Python tf.keras.layers.LayerNormalization用法及代碼示例
- Python tf.keras.layers.Layer.add_loss用法及代碼示例
- Python tf.keras.layers.Layer.add_metric用法及代碼示例
- Python tf.keras.layers.Layer.set_weights用法及代碼示例
- Python tf.keras.layers.Layer.get_weights用法及代碼示例
- Python tf.keras.layers.Lambda用法及代碼示例
- Python tf.keras.layers.LocallyConnected1D用法及代碼示例
- Python tf.keras.layers.LSTMCell用法及代碼示例
- Python tf.keras.layers.LSTM用法及代碼示例
- Python tf.keras.layers.LeakyReLU用法及代碼示例
- Python tf.keras.layers.LocallyConnected2D用法及代碼示例
- Python tf.keras.layers.InputLayer用法及代碼示例
- Python tf.keras.layers.serialize用法及代碼示例
- Python tf.keras.layers.Dropout用法及代碼示例
- Python tf.keras.layers.maximum用法及代碼示例
- Python tf.keras.layers.Conv2D用法及代碼示例
- Python tf.keras.layers.RepeatVector用法及代碼示例
- Python tf.keras.layers.Multiply用法及代碼示例
- Python tf.keras.layers.Activation用法及代碼示例
- Python tf.keras.layers.Conv1D用法及代碼示例
注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.keras.layers.Layer。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。