Apa perbedaan antara fungsi-fungsi ini?
tf.variable_op_scope(values, name, default_name, initializer=None)
Mengembalikan manajer konteks untuk mendefinisikan op yang menciptakan variabel. Manajer konteks ini memvalidasi bahwa nilai yang diberikan berasal dari grafik yang sama, memastikan bahwa grafik tersebut adalah grafik default, dan mendorong cakupan nama dan cakupan variabel.
tf.op_scope(values, name, default_name=None)
Mengembalikan manajer konteks untuk digunakan ketika mendefinisikan op Python. Manajer konteks ini memvalidasi bahwa nilai yang diberikan berasal dari grafik yang sama, memastikan bahwa grafik tersebut adalah grafik default, dan mendorong cakupan nama.
tf.name_scope(name)
Wrapper untuk
Graph.name_scope()
menggunakan grafik default. LihatGraph.name_scope()
untuk lebih jelasnya.
tf.variable_scope(name_or_scope, reuse=None, initializer=None)
Mengembalikan konteks untuk cakupan variabel. Ruang lingkup variabel memungkinkan untuk membuat variabel baru dan untuk berbagi yang sudah dibuat sambil memberikan pemeriksaan untuk tidak membuat atau berbagi secara tidak sengaja. Untuk detailnya, lihat Variabel Lingkup Cara, di sini kami hanya menyajikan beberapa contoh dasar.
sumber
Jawaban:
Mari kita mulai dengan pengantar singkat untuk berbagi variabel. Ini adalah mekanisme
TensorFlow
yang memungkinkan untuk berbagi variabel yang diakses di berbagai bagian kode tanpa meneruskan referensi ke variabel sekitar.Metode
tf.get_variable
ini dapat digunakan dengan nama variabel sebagai argumen untuk membuat variabel baru dengan nama tersebut atau mengambil yang dibuat sebelumnya. Ini berbeda dengan menggunakantf.Variable
konstruktor yang akan membuat variabel baru setiap kali dipanggil (dan berpotensi menambahkan akhiran ke nama variabel jika variabel dengan nama tersebut sudah ada).Untuk tujuan mekanisme berbagi variabel inilah diperkenalkan jenis cakupan yang terpisah (lingkup variabel).
Akibatnya, kami akhirnya memiliki dua jenis cakupan yang berbeda:
tf.name_scope
tf.variable_scope
Kedua cakupan memiliki efek yang sama pada semua operasi serta variabel yang dibuat menggunakan
tf.Variable
, yaitu, ruang lingkup akan ditambahkan sebagai awalan untuk operasi atau nama variabel.Namun, ruang lingkup nama diabaikan oleh
tf.get_variable
. Kita bisa melihat itu dalam contoh berikut:Satu-satunya cara untuk menempatkan variabel yang diakses menggunakan
tf.get_variable
dalam lingkup adalah dengan menggunakan lingkup variabel, seperti dalam contoh berikut:Ini memungkinkan kami untuk dengan mudah berbagi variabel di berbagai bagian program, bahkan dalam lingkup nama yang berbeda:
MEMPERBARUI
Pada versi r0.11,
op_scope
danvariable_op_scope
keduanya sudah usang dan digantikan olehname_scope
danvariable_scope
.sumber
scope
metode yang secara efektif melakukanvariable_scope
?"variable_scope
vsname_scope
bahkan diperlukan. Jika seseorang membuat variabel (dengan cara apa pun dengantf.Variable
atautf.get_variable
), tampaknya lebih alami bagi saya bahwa kita harus selalu bisa mendapatkannya jika kita menentukan ruang lingkup atau nama lengkapnya. Saya tidak mengerti mengapa satu mengabaikan nama ruang lingkup sedangkan yang lain tidak. Apakah Anda memahami alasan perilaku aneh ini?Baik variable_op_scope dan op_scope sekarang usang dan tidak boleh digunakan sama sekali.
Mengenai dua lainnya, saya juga memiliki masalah dalam memahami perbedaan antara variable_scope dan name_scope (mereka terlihat hampir sama) sebelum saya mencoba memvisualisasikan semuanya dengan membuat contoh sederhana:
Di sini saya membuat fungsi yang membuat beberapa variabel dan konstanta dan mengelompokkannya dalam cakupan (tergantung pada jenis yang saya berikan). Dalam fungsi ini, saya juga mencetak nama-nama semua variabel. Setelah itu, saya mengeksekusi grafik untuk mendapatkan nilai dari nilai yang dihasilkan dan menyimpan file acara untuk menyelidiki mereka di TensorBoard. Jika Anda menjalankan ini, Anda akan mendapatkan yang berikut:
Anda melihat pola yang sama jika Anda membuka TensorBoard (seperti yang Anda lihat di
b
luarscope_name
persegi panjang):Ini memberi Anda jawabannya :
Sekarang Anda melihat bahwa
tf.variable_scope()
menambahkan awalan ke nama-nama semua variabel (tidak peduli bagaimana Anda membuatnya), ops, konstanta. Di sisi laintf.name_scope()
mengabaikan variabel yang dibuat dengantf.get_variable()
karena mengasumsikan bahwa Anda tahu variabel mana dan dalam lingkup mana Anda ingin menggunakan.Dokumentasi yang baik tentang variabel Berbagi memberi tahu Anda hal itu
Dokumentasi yang sama memberikan perincian lebih lanjut bagaimana cara kerja Variable Scope dan kapan itu berguna.
sumber
Ruang nama adalah cara untuk mengatur nama untuk variabel dan operator secara hierarkis (mis. "ScopeA / scopeB / scopeC / op1")
tf.name_scope
menciptakan namespace untuk operator dalam grafik default.tf.variable_scope
menciptakan namespace untuk variabel dan operator dalam grafik default.tf.op_scope
sama dengantf.name_scope
, tetapi untuk grafik di mana variabel tertentu dibuat.tf.variable_op_scope
sama dengantf.variable_scope
, tetapi untuk grafik di mana variabel tertentu dibuat.Tautan ke sumber-sumber di atas membantu menyamarkan masalah dokumentasi ini.
Contoh ini menunjukkan bahwa semua jenis cakupan menentukan ruang nama untuk variabel dan operator dengan perbedaan berikut:
tf.variable_op_scope
atautf.variable_scope
kompatibel dengantf.get_variable
(mengabaikan dua cakupan lainnya)tf.op_scope
dantf.variable_op_scope
cukup pilih grafik dari daftar variabel tertentu untuk membuat ruang lingkup. Selain daripada perilaku mereka samatf.name_scope
dantf.variable_scope
sesuaitf.variable_scope
danvariable_op_scope
tambahkan initializer yang ditentukan atau standar.sumber
Mari kita membuatnya sederhana: gunakan saja
tf.variable_scope
. Mengutip pengembang TF, :Selain fakta bahwa
variable_scope
fungsionalitas pada dasarnya memperluas fungsi merekaname_scope
, pertimbangkan bagaimana mereka tidak bermain begitu baik bersama:Dengan berpegang teguh pada
variable_scope
hanya Anda menghindari beberapa sakit kepala karena ketidakcocokan semacam ini.sumber
Adapun API r0.11,
op_scope
danvariable_op_scope
keduanya sudah usang .name_scope
danvariable_scope
dapat disarangkan:sumber
Anda dapat menganggap mereka sebagai dua kelompok:
variable_op_scope
danop_scope
mengambil satu set variabel sebagai input dan dirancang untuk membuat operasi. Perbedaannya terletak pada bagaimana mereka memengaruhi pembuatan variabel dengantf.get_variable
:perhatikan nama variabel
v
dalam dua contoh.sama untuk
tf.name_scope
dantf.variable_scope
:Anda dapat membaca lebih lanjut tentang ruang lingkup variabel dalam tutorial . Pertanyaan serupa diajukan sebelumnya di Stack Overflow.
sumber
Dari bagian terakhir halaman ini dari dokumentasi tensorflow: Nama ops in
tf.variable_scope()
sumber
Tensorflow 2.0 Kompatibel Jawaban : Penjelasan
Andrzej Pronobis
danSalvador Dali
sangat rinci tentang Fungsi yang berkaitan denganScope
.Dari Fungsi Lingkup yang dibahas di atas, yang aktif seperti yang sekarang (17 Februari 2020) adalah
variable_scope
danname_scope
.Menentukan 2.0 Panggilan Kompatibel untuk fungsi-fungsi itu, kami bahas di atas, untuk kepentingan komunitas.
Fungsi dalam 1.x :
tf.variable_scope
tf.name_scope
Fungsi Masing-masing dalam 2.x :
tf.compat.v1.variable_scope
tf.name_scope
(tf.compat.v2.name_scope
jika bermigrasi dari1.x to 2.x
)Untuk informasi lebih lanjut tentang migrasi dari 1.x ke 2.x, silakan merujuk Panduan Migrasi ini .
sumber