TensorFlow變量函數(shù):tf.make_template

2018-10-28 16:58 更新
函數(shù):tf.make_template
make_template(
    name_,
    func_,
    create_scope_now_=False,
    unique_name_=None,
    custom_getter_=None,
    **kwargs
)

定義在:tensorflow/python/ops/template.py

參見指南:變量>共享變量

給定一個任意函數(shù),將其包裝,以便它進行變量共享.
這將 func_ 在模板中進行包裝,并對其進行部分評估.模板是在第一次被調(diào)用時創(chuàng)建變量并在其后重用它們的函數(shù).為了使 func_ 與模板兼容,它必須具有以下屬性:

  • 該函數(shù)應該創(chuàng)建所有可訓練的變量和任何通過調(diào)用 tf. get_variable 來重用的變量.如果使用 tf.Variable 創(chuàng)建訓練變量,則將拋出一個 ValueError 異常.可以通過指定 tf.Variable(..., trainable=false) 來創(chuàng)建用于局部變量的變數(shù).
  • 該函數(shù)可以在內(nèi)部使用變量范圍和其他模板來創(chuàng)建和重用變量,但它不應該使用 tf. global_variables 來捕獲在函數(shù)范圍之外定義的變量.
  • 內(nèi)部范圍和變量名稱不應取決于任何未提供給 make_template 的任何參數(shù).一般來說,你會得到一個 ValueError 異常,告訴你,如果你犯了一個錯誤,你試圖重用一個不存在的變量.

在下面的例子中,z 和 w 將用相同的 y 縮放.重要的是要注意,如果我們沒有分配 scalar_name 和為 z 和 w 分配不同的名稱,ValueError 異常將拋出,因為它不能重用該變量.

def my_op(x, scalar_name):
  var1 = tf.get_variable(scalar_name,
                         shape=[],
                         initializer=tf.constant_initializer(1))
  return x * var1

scale_by_y = tf.make_template('scale_by_y', my_op, scalar_name='y')

z = scale_by_y(input1)
w = scale_by_y(input2)

作為安全防護裝置, 如果訓練變量是通過調(diào)用 tf.Variable 創(chuàng)建的,則返回的函數(shù)將在第一次調(diào)用后引發(fā) ValueError.

如果所有這些都是真的,則模板將強制執(zhí)行以下2個屬性:

  1. 多次調(diào)用相同的模板將共享所有非局部變量.
  2. 兩個不同的模板保證是唯一的,除非您重新輸入與模板的初始定義相同的變量范圍并對其進行重定義,以下是此異常的示例:
    def my_op(x, scalar_name):
      var1 = tf.get_variable(scalar_name,
                             shape=[],
                             initializer=tf.constant_initializer(1))
      return x * var1
    
    with tf.variable_scope('scope') as vs:
      scale_by_y = tf.make_template('scale_by_y', my_op, scalar_name='y')
      z = scale_by_y(input1)
      w = scale_by_y(input2)
    
    # Creates a template that reuses the variables above.
    with tf.variable_scope(vs, reuse=True):
      scale_by_y2 = tf.make_template('scale_by_y', my_op, scalar_name='y')
      z2 = scale_by_y2(input1)
      w2 = scale_by_y2(input2)

根據(jù) create_scope_now_ 的值,完全可變范圍可能在第一次調(diào)用時或構(gòu)造時捕獲.如果此選項設置為 True,則通過對模板的重復調(diào)用創(chuàng)建的所有張量將有一個額外的尾部 _ N+1 到它們的名稱,因為在模板構(gòu)造函數(shù)中首次輸入作用域時,不會創(chuàng)建任何張量.

注:name_、func_ 和 create_scope_now_ 有一個尾部下劃線,以減少與 kwargs 沖突的可能性.

參數(shù):

  • name_:此模板創(chuàng)建的范圍的名稱.如有必要,該名稱將通過將 _N 追加到名稱中而成為唯一的.
  • func_:要包裝的函數(shù).
  • create_scope_now_:布爾控制是否應在構(gòu)造模板時或調(diào)用模板時創(chuàng)建作用域,默認值為 False,表示在調(diào)用模板時將創(chuàng)建作用域.
  • unique_name_:使用時,它會覆蓋 name_,而不是唯一的.如果已存在同一 scope/unique_name 的模板,并且重用為 false,則會引發(fā)錯誤.默認為 None.
  • custom_getter_:func_ 中使用的變量的可選自定義 getter.有關詳細信息,請參閱文檔.
  • ** kwargs:要應用于 func_ 的關鍵字參數(shù).

返回值:

一個函數(shù),用于封裝一組應創(chuàng)建并重用的變量.將創(chuàng)建一個封閉作用域,無論在何處調(diào)用 make_template,或者在調(diào)用結(jié)果的地方,這取決于 create_scope_now_ 的值.無論值如何,首次調(diào)用該模板時,都將進入該范圍,而不重復使用,并調(diào)用 func_ 創(chuàng)建變量,這些變量得保證是唯一的.所有后續(xù)調(diào)用都將重新輸入范圍并重新使用這些變量.

可能引發(fā)的異常:

  • ValueError:如果名稱為 None.
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號