Pertanyaan Mengapa kita membutuhkan TensorFlow tf.Graph?


Apa tujuan dari:

with tf.Graph().as_default()

Saya memiliki beberapa kode tensorflow yang menggunakan di atas. Namun, kode hanya memiliki satu grafik, jadi mengapa kita membutuhkan ini?


32
2017-09-21 11:11


asal


Jawaban:


TL; DR: Itu tidak perlu, tetapi ini adalah praktik yang baik untuk diikuti.

Karena grafik default selalu terdaftar, setiap op dan variabel ditempatkan ke grafik default. Pernyataan itu, bagaimanapun, menciptakan grafik baru dan menempatkan semuanya (dinyatakan di dalam ruang lingkupnya) ke dalam grafik ini. Jika grafik adalah satu-satunya grafik, itu tidak berguna. Tetapi ini adalah praktik yang baik karena jika Anda mulai bekerja dengan banyak grafik, lebih mudah untuk memahami di mana ops dan var ditempatkan. Karena pernyataan ini tidak membebani Anda, lebih baik untuk menulisnya. Hanya untuk memastikan bahwa jika Anda me-refactor kode di masa depan, operasi yang didefinisikan adalah milik grafik yang Anda pilih pada awalnya.


38
2017-09-21 12:25



Ini adalah artefak waktu ketika Anda harus secara eksplisit menentukan grafik untuk setiap op yang Anda buat.

Saya belum melihat kasus yang menarik untuk membutuhkan lebih dari satu grafik, jadi Anda biasanya bisa lolos dengan membuat grafik tersirat dan menggunakan tf.reset_default_graph() ketika Anda ingin menghapus slate bersih

Beberapa gotchas:

  • Tumpukan grafik default adalah utas lokal, sehingga membuat ops dalam beberapa utas akan membuat banyak grafik
  • Sesi terus menangani grafiknya (sess.graph), jadi jika Anda membuat Sesi sebelum menelepon tf.reset_default_graph(), grafik sesi Anda akan berbeda dari grafik default Anda yang berarti bahwa ops baru yang Anda buat tidak akan dapat dijalankan dalam sesi itu

Ketika Anda menekan salah satu dari gotcha tersebut, Anda dapat mengaturnya graph (yaitu, dari tf.get_default_graph() di utas lain atau sess.graph) menjadi grafik default sebagai berikut:

self.graph_context = graph.as_default()   # save it to some variable that won't get gc'ed
self.graph_context.enforce_nesting = False
self.graph_context.__enter__()

8
2017-09-21 16:20