منذ وقت ليس ببعيد ، واجهت مهمة الإنتاج المتمثلة في إطلاق Kesas شبكة عصبية Kesas مدرب باستخدام رمز C++ الأصلي. الغريب أن الحل لم يكن تافهاً على الإطلاق. نتيجة لذلك ، كان هناك مكتبة خاصة ، مما يتيح هذه الفرصة. حول كيف يتم ذلك - الشبكات العصبية على الصلبان النظيفة وسيتم مقال اليوم القصير.
بالنسبة لأولئك الذين لا يستطيعون الانتظار - إليك مستودع جيثب ، مع وصف تفصيلي للاستخدام. حسنا ، أنا أسأل الجميع تحت القط ...
بيان المشكلة.
في هذه العملية ، كنت بحاجة إلى تشغيل نموذج مدرب في تطبيق C++ (Unreal Engune 4) . ولكن هذا هو الحظ السيئ: اليوم لا يوجد عملياً طريقة لتشغيل طراز Keras في C ++.
خيار الاتصال Python من C++ لم يكن جيدًا بالنسبة لي. كان هناك خيار آخر لتحويل نموذج Keras إلى نموذج TensorFlow ثم إنشاء TensoFflow للصلبان واستدعاء TF API من رمز C ++.
هذه العملية من التحول موصوفة جيدا في هذه المقالة . ولكن الصعوبات تنشأ أيضا مع هذا. أولاً ، يمر Bzzel عبر Bzzel . والإطار نفسه هو شيء غريب الأطوار ورفض التجمع تحت UE4 . ثانياً ، TF نفسها شيء كبير إلى حد ما ، لكنني أردت شيئًا أكثر وزنًا وإنتاجية. لا أستطيع إلا أن أقول أنه في الأماكن المفتوحة لجيثب تم العثور على مشروع نصف عمل ، مع الوظيفة التي احتاجها. لكنه لم يدعم الإصدارات الحالية من Python Keras . ولم تنجح محاولات إعادة تشكيلها: تعطل تطبيق C ++ بسبب خطأ Core Dump . كان من المعتاد أن أكتب التنفيذ الخاص بي ...
نحن نكتب مكتبتنا!
تحول الصخور أصعب ، ورمي زجاجة بيفاسا الطاقة ، جلست في الرمز. إن كود TensorFlow ، محاولات لإعادة تأهيل الكود الموجود في كود ، وبعض المعرفة حول الخوارزميات وهياكل البيانات (بفضل ITMO لدوراتها) والموسيقى الجيدة في أذني ساعدتني كثيرًا في تنفيذ هذه المكتبة. بطريقة ما كانت المكتبة مكتوبة في ليلة واحدة.
وتلبية ذلك: Keras2cpp!
الجزء الأول من المكتبة هو وحدة بيثون لحفظ النموذج المدرّب في نسق ثنائي خاص به.
لا يوجد شيء معقد في هذه العملية. نقرأ فقط نموذج Keras شيئًا فشيئًا في ملف: أولاً ، ثم ، ثم بالتنسيق float .
الآن دعنا ننتقل إلى تطبيق C ++ اللذيذ.
المستخدم لديه 2 كيان tensor model .
Tensor - يعيد توزيع البيانات التي تعمل بها الشبكة العصبية وهو عبارة عن تطبيق للكمبيوتر من tensor. المدعومة حاليا البعد الأقصى في 4 أبعاد. يتم تخزين البعد لكل البعد في std::vector<int> dims_; ويكون وزن كل عنصر tensor في std::vector<int> data_; . من بين الطرق المتاحة ، يمكن تمييز void Print() و Tensor Select(int row) . بقية العمليات التي يمكنك رؤيتها في الكود المصدري. بعد كتابة الرياضيات عن التنسورات ، بدأت في تطبيق النماذج.
الطراز - عبارة عن مجموعة من الطبقات التي يتم فيها تحديد العمليات على التنسورات ومصفوفة الوزن. 2 وظائف متاحة للمستخدم virtual bool LoadModel(const std::string& filename); وتطبيق virtual bool Apply(Tensor* in, Tensor* out); .
هنا مثال رمز كامل.
python_model.py:
import numpy as np from keras import Sequential from keras.layers import Dense
cpp_mpdel.cc:
#include "keras_model.h" int main() {
هذا كل ما أعتقد. استمتع باستخدامه ، وسأذهب إلى صديقتي الحبيبة C # و Python لكتابة المزيد من الشبكات العصبية.
PS
أحببت كتابة هذه المكتبة. عندما تكتب كل شيء بنفسك من البداية ، فأنت تفهم أكثر ، ولكن كيف تعمل ... نخطط لإضافة دعم للبنيات الأخرى ووحدات معالجة الرسومات ...
مستودع جيثب
المصدر