هذا هو مقالتي الأولى عن التعلم الآلي. لقد شاركت مؤخرًا في التعلم الآلي ورؤية الكمبيوتر. في هذا المقال والمقالات المستقبلية ، سوف أشارك الملاحظات والحلول لمشاكل محددة عند استخدام TensorFlow و Keras. في هذه المقالة ، سأتحدث عن مشكلة واحدة غير واضحة عند العمل مع TensorFlow و Keras - التحميل والتنفيذ المتزامنين لعدة نماذج. إذا لم تكن على دراية بكيفية عمل TensorFlow و Keras داخليًا ، فقد يكون هذا الموضوع مشكلة للمبتدئين. إذا كنت مهتما بالموضوع ، يرجى تحت القط.
يقدم TensorFlow العمليات الحسابية في نموذج الشبكة العصبية في الذاكرة كرسم بياني للتبعيات بين العمليات أثناء التهيئة. عند تنفيذ النموذج ، يقوم TensorFlow بإجراء العمليات الحسابية على الرسم البياني خلال جلسة محددة. لن أخوض في تفاصيل هذه الكيانات في Tensorflow.
يمكنك قراءة المزيد عن الرسوم البيانية وجلسات على
المتوسطة و Habré:
هنا وهنا .
عادة ما نعمل مع نموذج واحد ولا توجد مشاكل هنا. الآن دعنا نتخيل أننا نعمل مع فصلين. يعمل كلا الفصلين مع نماذج Keras: إنشاء بنية عصبية ، وتحميل الأوزان المدربة ، وتنفيذ التنبؤات. عند إجراء فئتين في خط أنابيب واحد (على سبيل المثال ، في الخطوة الأولى التي نجريها اكتشاف الوجه في الصورة ، في التعرف على الإنسان في المرة التالية) ، قد يحدث خطأ مماثل:
Error Tensor("norm_layer/l2_normalize:0", shape=(?, 128), dtype=float32) is not an element of this graph
سبب الخطأ هو أن Keras بشكل افتراضي
يعمل فقط مع الجلسة الافتراضية ولا يقوم بتسجيل الجلسة الجديدة كجلسة افتراضية.
عند العمل مع طراز Keras ، يجب على المستخدم تعيين الجلسة الجديدة بشكل صريح كجلسة افتراضية. هذا يمكن القيام به مثل هذا:
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)
نقوم بإنشاء TensorFlow Graph و Session وتحميل النموذج الجديد داخل جلسة TensorFlow الجديدة.
صف
with self.graph.as_default():
يعني
أننا نريد استخدام الرسم البياني الجديد () كرسم بياني افتراضي وفي الصف
with self.session.as_default():
نشير إلى أننا نرغب في استخدام الدورة الذاتية كجلسة افتراضية وتنفيذ التعليمات البرمجية التالية في هذه الجلسة. ينشئ the build مدير سياق يتيح لك العمل بفعالية مع الذاكرة عند التعامل مع كائنات كثيفة الاستخدام للموارد (على سبيل المثال ، قراءة الملفات) ، لأنه يحرر الموارد تلقائيًا عند الخروج من الكتلة with.
عندما نحتاج إلى تحقيق التوقع ، فإننا نفعل ذلك كما يلي:
with self.graph.as_default(): with self.session.as_default(): result = self.model.predict(np.expand_dims(img, axis=0), batch_size=1)
نحن فقط ندعو طريقة التنبؤ () داخل جلسة TF التي تم إنشاؤها مسبقًا.
هذا كل شيء الآن. حظا سعيدا للجميع ونراكم قريبا!