當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python tf.keras.layers.Layer用法及代碼示例


這是所有層都繼承的類。

繼承自: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) ,如果層需要,用戶可以選擇添加 trainingmask*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.

例子:

這是一個基本示例:具有兩個變量 wb 的層,返回 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 == []

有關創建層的更多信息,請參閱通過子類化創建新層和模型指南

相關用法


注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.keras.layers.Layer。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。