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


Python tf.compat.v1.keras.utils.track_tf1_style_variables用法及代碼示例


在此裝飾器中包裝層和模塊方法以捕獲 tf1 樣式的權重。

用法

tf.compat.v1.keras.utils.track_tf1_style_variables(
    method
)

參數

  • method 裝飾的方法。這應該屬於自定義的 tf.Module、tf.keras.layers.Layer 或 tf.keras.Model。

返回

  • 裝飾方法。

使用此裝飾器裝飾 tf.keras.Layertf.Module 的方法將導致層/模塊跟蹤在裝飾方法內通過 tf.compat.v1.get_variable (以及通過擴展 tf.compat.v1.layers )創建/使用的權重。

除了在標準 layer.variable /module.variable /etc 下跟蹤權重本身。屬性,如果該方法屬於tf.keras.Layer,則通過get_variabletf.compat.v1.layers 正則化參數指定的任何正則化損失將由標準layer.losses 屬性下的層跟蹤。

此跟蹤允許在 Keras 層內使用大量 TF1 風格的model-forward-pass 代碼,或在啟用了 TF2 行為的 TF2 中使用 tf.Modules

將基於 tf.compat.v1.layer 的建模代碼捕獲為 Keras 層的示例:

class WrappedDoubleDenseLayer(tf.keras.layers.Layer):

  def __init__(self, units, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.units = units

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs):
    with tf.compat.v1.variable_scope("double_dense_layer"):
      out = tf.compat.v1.layers.dense(
          inputs, self.units, name="dense_one",
          kernel_initializer=tf.compat.v1.random_normal_initializer,
          kernel_regularizer="l2")
      out = tf.compat.v1.layers.dense(
          out, self.units, name="dense_two",
          kernel_initializer=tf.compat.v1.random_normal_initializer(),
          kernel_regularizer="l2")
    return out

# Create a layer that can be used as a standard keras layer
layer = WrappedDoubleDenseLayer(10)

# call the layer on inputs
layer(...)

# Variables created/used within the scope will be tracked by the layer
layer.weights
layer.trainable_variables

# Regularization losses will be captured in layer.losses after a call,
# just like any other Keras layer
reg_losses = layer.losses

將基於 tf.compat.v1.get_variable 的建模代碼捕獲為 Keras 層的示例:

class WrappedDoubleDenseLayer(tf.keras.layers.Layer):

  def __init__(self, units, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.units = units

  @tf.compat.v1.keras.utils.track_tf1_style_variables
  def call(self, inputs):
    out = inputs
    with tf.compat.v1.variable_scope("double_dense_layer"):
      with tf.compat.v1.variable_scope("dense_one"):
        # The weights are created with a `regularizer`,
        # so the layer should track their regularization losses
        kernel = tf.compat.v1.get_variable(
            shape=[out.shape[-1], self.units],
            regularizer=regularizers.L2(),
            initializer=init_ops.ones_initializer(),
            name="kernel")
        bias = tf.compat.v1.get_variable(
            shape=[self.units,],
            initializer=init_ops.zeros_initializer(),
            name="bias")
        out = tf.compat.v1.math.matmul(out, kernel)
        out = tf.compat.v1.nn.bias_add(out, bias)
      with tf.compat.v1.variable_scope("dense_two"):
        kernel = tf.compat.v1.get_variable(
            shape=[out.shape[-1], self.units],
            regularizer=regularizers.L2(),
            initializer=init_ops.ones_initializer(),
            name="kernel")
        bias = tf.compat.v1.get_variable(
            shape=[self.units,],
            initializer=init_ops.zeros_initializer(),
            name="bias")
        out = tf.compat.v1.math.matmul(out, kernel)
        out = tf.compat.v1.nn.bias_add(out, bias)
    return out

# Create a layer that can be used as a standard keras layer
layer = WrappedDoubleDenseLayer(10)

# call the layer on inputs
layer(...)

# Variables created/used within the scope will be tracked by the layer
layer.weights
layer.trainable_variables

# Regularization losses will be captured in layer.losses after a call,
# just like any other Keras layer
reg_losses = layer.losses

正則化損失:

如果 get_variable 調用或 compat.v1.layer 創建中指定的任何正則化器出現在您的修飾方法中並且該方法屬於 tf.keras.Layer /tf.keras.Module ,則它們將被捕獲。正則化損失可以在調用後在layer.losses 中訪問,就像在標準 Keras 層中一樣,並且將被包含該層的任何模型捕獲。附加到 Keras 層/模型設置為您的層屬性的正則化損失也將在標準 Keras 正則化損失跟蹤中捕獲。

(雖然模塊沒有losses 屬性,但計算正則化損失的no-arg 可調用函數可以作為私有module._tf1_style_var_store._regularizers 屬性中的dict 值進行跟蹤,但僅適用於tf.compat.v1.layersget_variable 權重,不適用於任何其他嵌套Keras 層/tf.Modules)

變量範圍/變量重用:在您的裝飾方法中基於variable-scope 的重用將受到尊重,並像 TF1 中基於variable-scope 的重用一樣工作。

變量名稱/預訓練檢查點加載:get_variable 和 compat.v1.layer 層的變量命名將與 TF1 名稱匹配,因此您應該能夠重新使用基於名稱的舊檢查點。 Keras 層/模型或tf.Variable 創建的變量的變量命名可能會在即刻執行時發生變化。

如果你裝飾 layer.call 訓練 Arg:如果 call 在其調用簽名中包含 training arg 或 **kwargs varargs,Keras 會將 training arg 傳遞給該層,類似於 keras 如何將 training 傳遞給TF2 中的其他層在其call 實現中具有相似的簽名。在tf.keras.layers.Layer 上的文檔中查看更多詳細信息,以了解將傳遞的內容和時間。注意:tf.compat.v1.layers 通常不使用 training=None 調用,因此 forward_pass 的訓練參數可能不會傳遞給它們,除非您將其明確傳遞給它們的調用。

注意事項:

  • TF2 不會修剪未使用的變量更新(或未使用的輸出)。您可能需要調整前向密碼以避免不打算使用的計算或變量更新。
  • 避免在用 track_tf1_style_variables 修飾的方法內的 tf.function 中嵌套變量創建雖然可以從 tf.function 內安全地使用該方法,但在修飾的方法內使用函數可能會破壞變量範圍。
  • 這個裝飾器隻為遺留 tf1-style get_variable /compat.v1.layers 使用添加隱式跟蹤。如果您想在裝飾方法中使用嵌套的 Keras 層/模型,您需要將它們分配為層的屬性,以便 Keras/Module 的標準麵向對象的權重(以及層的損失跟蹤)將發揮作用。請參閱介紹有關更多信息,請參閱模塊、層和模型指南。作為備份,compat.v1.keras.utils.get_or_create_layer 方法將輕鬆跟蹤現有 TF1 代碼的嵌套 keras 模型權重和損失,但新代碼應使用顯式跟蹤。

相關用法


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