Halaman ini diterjemahkan oleh Cloud Translation API.
Switch to English

tf.compat.v1.variable_scope

Lihat sumber di GitHub

Seorang manajer konteks untuk mendefinisikan ops yang menciptakan variabel (lapisan).

Ini memvalidasi manajer konteks bahwa (opsional) values adalah dari grafik yang sama, memastikan grafik yang adalah grafik default, dan mendorong lingkup nama dan lingkup variabel.

Jika name_or_scope tidak ada, digunakan sebagaimana adanya. Jika name_or_scope adalah Tidak ada, maka default_name digunakan. Dalam hal ini, jika nama yang sama telah digunakan sebelumnya dalam lingkup yang sama, maka akan dibuat unik dengan menambahkan _N untuk itu.

lingkup variabel memungkinkan Anda untuk membuat variabel baru dan untuk berbagi yang sudah dibuat sambil memberikan cek untuk tidak membuat atau berbagi secara tidak sengaja. Untuk rincian, lihat Variable Scope Cara , di sini kita hanya menyajikan contoh dasar.

Contoh sederhana bagaimana membuat variabel baru:

 with tf.compat.v1.variable_scope("foo"):
    with tf.compat.v1.variable_scope("bar"):
        v = tf.compat.v1.get_variable("v", [1])
        assert v.name == "foo/bar/v:0"
 

Contoh sederhana tentang bagaimana untuk masuk kembali lingkup variabel premade aman:

 with tf.compat.v1.variable_scope("foo") as vs:
  pass

# Re-enter the variable scope.
with tf.compat.v1.variable_scope(vs,
                       auxiliary_name_scope=False) as vs1:
  # Restore the original name_scope.
  with tf.name_scope(vs1.original_name_scope):
      v = tf.compat.v1.get_variable("v", [1])
      assert v.name == "foo/v:0"
      c = tf.constant([1], name="c")
      assert c.name == "foo/c:0"
 

Perlu diingat bahwa counter untuk default_name dibuang setelah lingkup induk keluar. Oleh karena itu ketika kode re-memasuki ruang lingkup (misalnya dengan menyimpannya), semua counter default_name bersarang akan restart.

Misalnya:

 with tf.compat.v1.variable_scope("foo") as vs:
  with tf.compat.v1.variable_scope(None, default_name="bar"):
    v = tf.compat.v1.get_variable("a", [1])
    assert v.name == "foo/bar/a:0", v.name
  with tf.compat.v1.variable_scope(None, default_name="bar"):
    v = tf.compat.v1.get_variable("b", [1])
    assert v.name == "foo/bar_1/b:0"

with tf.compat.v1.variable_scope(vs):
  with tf.compat.v1.variable_scope(None, default_name="bar"):
    v = tf.compat.v1.get_variable("c", [1])
    assert v.name == "foo/bar/c:0"   # Uses bar instead of bar_2!
 

contoh dasar dari berbagi AUTO_REUSE variabel:

 def foo():
  with tf.compat.v1.variable_scope("foo", reuse=tf.compat.v1.AUTO_REUSE):
    v = tf.compat.v1.get_variable("v", [1])
  return v

v1 = foo()  # Creates v.
v2 = foo()  # Gets the same, existing v.
assert v1 == v2
 

contoh dasar berbagi variabel dengan reuse = True:

 with tf.compat.v1.variable_scope("foo"):
    v = tf.compat.v1.get_variable("v", [1])
with tf.compat.v1.variable_scope("foo", reuse=True):
    v1 = tf.compat.v1.get_variable("v", [1])
assert v1 == v
 

Berbagi variabel dengan menangkap lingkup dan pengaturan penggunaan kembali:

 with tf.compat.v1.variable_scope("foo") as scope:
    v = tf.compat.v1.get_variable("v", [1])
    scope.reuse_variables()
    v1 = tf.compat.v1.get_variable("v", [1])
assert v1 == v
 

Untuk mencegah berbagi disengaja variabel, kita menaikkan pengecualian ketika mendapatkan variabel yang ada di lingkup non-menggunakan kembali.

 with tf.compat.v1.variable_scope("foo"):
    v = tf.compat.v1.get_variable("v", [1])
    v1 = tf.compat.v1.get_variable("v", [1])
    #  Raises ValueError("... v already exists ...").
 

Demikian pula, kita menaikkan pengecualian ketika mencoba untuk mendapatkan variabel yang tidak ada dalam mode digunakan kembali.

 with tf.compat.v1.variable_scope("foo", reuse=True):
    v = tf.compat.v1.get_variable("v", [1])
    #  Raises ValueError("... v does not exists ...").
 

Perhatikan bahwa reuse bendera diwariskan: jika kita membuka ruang lingkup menggunakan kembali, maka semua sub-lingkup menjadi menggunakan kembali juga.

Catatan tentang nama scoping: Menetapkan reuse tidak mempengaruhi penamaan ops lain seperti mult. Lihat pembahasan terkait di github # 6189

Perhatikan bahwa sampai dengan versi 1.0, itu diperbolehkan (meskipun secara eksplisit asa) untuk lulus False untuk argumen reuse, menghasilkan perilaku tak tercatat sedikit berbeda dari ada. Mulai dari 1.1.0 lewat None dan False sebagai reuse memiliki efek yang sama persis.

Sebuah catatan tentang menggunakan variabel scopes di lingkungan multi-berulir: lingkup variabel adalah benang lokal, sehingga satu thread tidak akan melihat ruang lingkup lain benang saat ini. Juga, ketika menggunakan default_name , nama lingkup unik juga dihasilkan hanya pada basis per benang. Jika nama yang sama digunakan dalam thread yang berbeda, yang tidak mencegah thread baru dari menciptakan ruang lingkup yang sama. Namun, variabel toko yang mendasari dibagi di thread (dalam grafik yang sama). Dengan demikian, jika thread lain mencoba untuk membuat variabel baru dengan nama yang sama sebagai variabel yang diciptakan oleh thread sebelumnya, maka akan gagal kecuali reuse Benar.

Selanjutnya, setiap thread dimulai dengan variabel lingkup kosong. Jadi jika Anda ingin mempertahankan awalan nama dari lingkup dari thread utama, Anda harus menangkap lingkup thread utama dan masukkan kembali dalam setiap thread. untuk misalnya

 main_thread_scope = variable_scope.get_variable_scope()

# Thread's target function:
def thread_target_fn(captured_scope):
  with variable_scope.variable_scope(captured_scope):
    # .... regular code for this thread


thread = threading.Thread(target=thread_target_fn, args=(main_thread_scope,))
 

name_or_scope string atau VariableScope : ruang lingkup untuk membuka.
default_name Nama default untuk menggunakan jika name_or_scope argumen adalah None , nama ini akan uniquified. Jika name_or_scope disediakan itu tidak akan digunakan dan oleh karena itu tidak diperlukan dan dapat ada.
values Daftar Tensor argumen yang dilewatkan ke fungsi op.
initializer bawaan initializer untuk variabel dalam lingkup ini.
regularizer regularizer default untuk variabel dalam lingkup ini.
caching_device perangkat caching default untuk variabel dalam lingkup ini.
partitioner partitioner default untuk variabel dalam lingkup ini.
custom_getter getter kustom default untuk variabel dalam lingkup ini.
reuse True , Tidak ada, atau tf.compat.v1.AUTO_REUSE; jika True , kita masuk ke modus penggunaan kembali untuk lingkup ini serta semua sub-lingkup; jika tf.compat.v1.AUTO_REUSE, kita membuat variabel jika mereka tidak ada, dan kembali mereka sebaliknya; jika ada, kita mewarisi bendera reuse orang tua lingkup ini. Ketika eksekusi bersemangat diaktifkan, variabel baru selalu diciptakan kecuali sebuah EagerVariableStore atau template yang sedang aktif.
dtype ketik variabel yang dibuat dalam lingkup ini (default untuk jenis dalam lingkup berlalu, atau warisan dari lingkup induk).
use_resource Jika False, semua variabel akan Variabel biasa. Jika Benar, ResourceVariables eksperimental dengan semantik yang terdefinisi dengan baik akan digunakan sebagai gantinya. Default False (kemudian akan berubah menjadi True). Ketika eksekusi bersemangat diaktifkan argumen ini selalu dipaksa untuk menjadi Benar.
constraint Fungsi proyeksi opsional untuk diterapkan ke variabel setelah diperbarui oleh Optimizer (misalnya digunakan untuk mengimplementasikan kendala norma atau kendala nilai untuk lapisan bobot). Fungsi harus mengambil sebagai masukan Tensor unprojected mewakili nilai variabel dan mengembalikan Tensor untuk nilai proyeksi (yang harus memiliki bentuk yang sama). Kendala tidak aman untuk digunakan saat melakukan pelatihan didistribusikan asynchronous.
auxiliary_name_scope Jika True , kita membuat sebuah lingkup nama tambahan dengan ruang lingkup. Jika False , kita tidak menciptakannya. Perhatikan bahwa argumen tidak diwariskan, dan hanya berlaku untuk sekali saat membuat. Anda hanya harus menggunakannya untuk memasuki kembali ruang lingkup variabel premade.

ValueError ketika mencoba untuk menggunakan kembali dalam membuat ruang lingkup, atau membuat dalam lingkup reuse.
TypeError ketika jenis beberapa argumen yang tidak tepat.

metode

__enter__

Lihat sumber

__exit__

Lihat sumber