Sejauh yang saya tahu, Variable
adalah operasi default untuk membuat variabel, dan get_variable
terutama digunakan untuk berbagi bobot.
Di satu sisi, ada beberapa orang yang menyarankan untuk menggunakan get_variable
alih-alih Variable
operasi primitif setiap kali Anda membutuhkan variabel. Di sisi lain, saya hanya melihat penggunaan get_variable
dalam dokumen dan demo resmi TensorFlow.
Oleh karena itu, saya ingin mengetahui beberapa aturan praktis tentang cara menggunakan kedua mekanisme ini dengan benar. Apakah ada prinsip "standar"?
python
tensorflow
Lifu Huang
sumber
sumber
Jawaban:
Saya akan merekomendasikan untuk selalu menggunakan
tf.get_variable(...)
- ini akan mempermudah refactor kode Anda jika Anda perlu berbagi variabel kapan saja, misalnya dalam pengaturan multi-gpu (lihat contoh CIFAR multi-gpu). Tidak ada sisi negatifnya.Murni
tf.Variable
adalah tingkat yang lebih rendah; di beberapa titiktf.get_variable()
tidak ada sehingga beberapa kode masih menggunakan cara tingkat rendah.sumber
tf.Variable
dengantf.get_variable
mana - mana. Saat itulah saya ingin menginisialisasi variabel dengan array numpy, saya tidak dapat menemukan cara yang bersih dan efisien untuk melakukannya seperti yang saya lakukantf.Variable
. Bagaimana Anda mengatasinya? Terima kasih.tf.Variable adalah kelas, dan ada beberapa cara untuk membuat tf.Variable termasuk
tf.Variable.__init__
dantf.get_variable
.tf.Variable.__init__
: Membuat variabel baru dengan nilai_awal .tf.get_variable
: Mendapat variabel yang ada dengan parameter ini atau membuat yang baru. Anda juga bisa menggunakan penginisialisasi.Sangat berguna untuk menggunakan penginisialisasi seperti
xavier_initializer
:Informasi lebih lanjut di sini .
sumber
Variable
sebenarnya maksud saya menggunakan itu__init__
. Karenaget_variable
sangat nyaman, saya bertanya-tanya mengapa sebagian besar kode TensorFlow yang saya lihat digunakan,Variable
bukanget_variable
. Apakah ada konvensi atau faktor yang perlu dipertimbangkan saat memilih di antara keduanya. Terima kasih!tf.Variable()
kita dapat menginisialisasi sebagai nilai acak dari distribusi normal yang terpotong. Inilah contoh sayaw1 = tf.Variable(tf.truncated_normal([5, 50], stddev = 0.01), name = 'w1')
. Apa yang setara dengan ini? bagaimana cara saya mengatakan bahwa saya ingin normal yang terpotong? Haruskah saya lakukanw1 = tf.get_variable(name = 'w1', shape = [5,50], initializer = tf.truncated_normal, regularizer = tf.nn.l2_loss)
?tf.truncated_normal_initializer()
untuk mendapatkan hasil yang diinginkan.Saya dapat menemukan dua perbedaan utama antara yang satu dan yang lainnya:
Pertama adalah
tf.Variable
selalu membuat variabel baru, sedangkantf.get_variable
mendapatkan variabel yang sudah ada dengan parameter tertentu dari grafik, dan jika tidak ada, membuat variabel baru.tf.Variable
membutuhkan nilai awal yang ditentukan.Penting untuk mengklarifikasi bahwa fungsi tersebut
tf.get_variable
mengawali nama dengan cakupan variabel saat ini untuk melakukan pemeriksaan penggunaan kembali. Sebagai contoh:Kesalahan pernyataan terakhir menarik: Dua variabel dengan nama yang sama di bawah lingkup yang sama seharusnya merupakan variabel yang sama. Tetapi jika Anda menguji nama variabel
d
dane
Anda akan menyadari bahwa Tensorflow mengubah nama variabele
:sumber
d.name
dane.name
, saya baru saja menemukan dokumen TensorFlow tentang operasi penamaan grafik tensor yang menjelaskannya:If the default graph already contained an operation named "answer", the TensorFlow would append "_1", "_2", and so on to the name, in order to make it unique.
Perbedaan lainnya terletak pada yang satu dalam hal
('variable_store',)
koleksi tetapi yang lainnya tidak.Silakan lihat kode sumbernya :
Izinkan saya mengilustrasikan bahwa:
Hasil:
sumber