Trik Pembelajaran Mesin - Bekerja dengan Banyak Model dalam Keras

Ini adalah artikel pertama saya tentang pembelajaran mesin. Baru-baru ini, saya secara profesional terlibat dalam pembelajaran mesin dan visi komputer. Dalam artikel ini dan yang akan datang, saya akan membagikan pengamatan dan solusi untuk masalah spesifik saat menggunakan TensorFlow dan Keras. Pada artikel ini saya akan berbicara tentang satu masalah yang tidak jelas ketika bekerja dengan TensorFlow dan Keras - pemuatan dan eksekusi simultan beberapa model. Jika Anda tidak terbiasa dengan bagaimana TensorFlow dan Keras bekerja secara internal, topik ini bisa menjadi masalah bagi pemula. Jika Anda tertarik pada topik, silakan di bawah kucing.

TensorFlow menyajikan perhitungan dalam model jaringan saraf dalam memori sebagai grafik ketergantungan antar operasi selama inisialisasi. Saat menjalankan model, TensorFlow melakukan perhitungan pada grafik dalam sesi tertentu. Saya tidak akan membahas detail entitas ini di Tensorflow.

Anda dapat membaca lebih lanjut tentang grafik dan sesi tentang Medium dan Habré: di sini dan di sini .

Biasanya kami bekerja dengan satu model dan tidak ada masalah di sini. Sekarang mari kita bayangkan bahwa kita bekerja dengan dua kelas. Kedua kelas bekerja dengan model Keras: membuat arsitektur neural, memuat bobot yang terlatih, dan melakukan prediksi. Saat melakukan dua kelas dalam satu pipa (misalnya, pada langkah pertama kami melakukan deteksi wajah di foto, di berikutnya - pengenalan manusia), kesalahan serupa mungkin terjadi:

Error Tensor("norm_layer/l2_normalize:0", shape=(?, 128), dtype=float32) is not an element of this graph 

Alasan kesalahan adalah bahwa Keras secara default hanya berfungsi dengan sesi default dan tidak mendaftarkan sesi baru sebagai sesi default.
Saat bekerja dengan model Keras, pengguna harus secara eksplisit mengatur sesi baru sebagai sesi default. Ini bisa dilakukan seperti ini:

 self.graph = tf.Graph() with self.graph.as_default(): self.session = tf.Session(graph=self.graph) with self.session.as_default(): self.model = WideResNet(face_size, depth=depth, k=width)() model_dir = <model_path> ... self.model.load_weights(fpath) 

Kami membuat Grafik dan Sesi TensorFlow baru dan memuat model di dalam sesi TensorFlow baru.
Tali

 with self.graph.as_default(): 

berarti kita ingin menggunakan grafik baru () sebagai grafik default dan di baris

 with self.session.as_default(): 

kami mengindikasikan bahwa kami ingin menggunakan self.session sebagai sesi default dan mengeksekusi kode berikutnya dalam sesi ini. Konstruk with menciptakan manajer konteks yang memungkinkan kita untuk bekerja secara efisien dengan memori ketika berhadapan dengan objek padat sumber daya (misalnya, membaca file), karena itu secara otomatis membebaskan sumber daya ketika kita keluar dari blok with.

Ketika kami harus memenuhi prediksi, kami melakukannya seperti ini:

 with self.graph.as_default(): with self.session.as_default(): result = self.model.predict(np.expand_dims(img, axis=0), batch_size=1) 

Kami hanya memanggil metode predict () di dalam sesi TF yang dibuat sebelumnya.

Itu saja untuk saat ini. Semoga beruntung untuk semua orang dan sampai jumpa lagi!

Source: https://habr.com/ru/post/id465093/


All Articles