C++ للتعلم الآلي: الإمكانيات العملية والقيود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

C++ للتعلم الآلي: الإمكانيات والقيود عمليًا

\n\n

عندما يتعلق الأمر بالتعلم الآلي، يتذكر معظم المطورين على الفور Python مع نظامها البيئي PyTorch و TensorFlow و scikit-learn. ومع ذلك، تظل C++ أداة لا غنى عنها لأنظمة الإنتاج حيث تكون السرعة وزمن الوصول المنخفض والتحكم في الذاكرة أمرًا بالغ الأهمية. في هذه المقالة، سنحلل كيفية استخدام C++ للتعلم الآلي عمليًا، وما هي نقاط قوتها وأين تقصر أمام Python.

\n\n

لماذا لا تزال C++ ذات صلة بـ ML؟

\n

تسيطر Python على البحث والنمذجة الأولية، لكن C++ هي اللغة التي كُتبت بها نوى جميع أطر ML الشائعة تقريبًا (TensorFlow و PyTorch و XGBoost). إذا كنت بحاجة إلى:

\n
    \n
  • نشر نموذج على الأجهزة المضمنة (إنترنت الأشياء، الروبوتات)؛
  • \n
  • معالجة البيانات في الوقت الفعلي (القيادة الذاتية، التداول)؛
  • \n
  • تحقيق أقصى أداء دون تكاليف إضافية للمفسر؛
  • \n
  • دمج ML في كود C++ موجود (الألعاب، التصميم بمساعدة الحاسوب، المحاكيات)،
  • \n
\n

عندها تصبح C++ ليست مجرد بديل، بل الخيار الوحيد.

\n\n

الإمكانيات العملية لـ C++ في ML

\n\n

1. العمل مع الجبر الخطي (Eigen)

\n

أساس أي ML هو عمليات المصفوفات. في C++، تُستخدم مكتبة Eigen لهذا الغرض. توفر أداءً قريبًا من التحسينات اليدوية، ولكن مع بناء جملة مناسب.

\n
#include <Eigen/Dense>\n#include <iostream>\n\nint main() {\n    // إنشاء مصفوفات\n    Eigen::MatrixXd X(3, 2);\n    X << 1, 2,\n          3, 4,\n          5, 6;\n    Eigen::VectorXd y(3);\n    y << 2, 4, 6;\n\n    // حل مسألة المربعات الصغرى: w = (X^T X)^{-1} X^T y\n    Eigen::VectorXd w = (X.transpose() * X).ldlt().solve(X.transpose() * y);\n    std::cout << "أوزان النموذج: " << w.transpose() << std::endl;\n    return 0;\n}
\n

يحسب هذا الكود الانحدار الخطي بدون حلقة واحدة - يستخدم Eigen التوجيه المتجه وتعدد الخيوط تحت الغطاء.

\n\n

2. ML الكلاسيكي مع Dlib

\n

Dlib هي واحدة من مكتبات C++ القليلة التي توفر خوارزميات جاهزة: SVM، أقرب الجيران k، أشجار القرار وحتى التعلم العميق.

\n
#include <dlib/svm.h>\n#include <dlib/rand.h>\n#include <iostream>\n\nint main() {\n    using sample_type = dlib::matrix<double, 2, 1>;\n    std::vector<sample_type> samples;\n    std::vector<double> labels;\n\n    // توليد بيانات اصطناعية\n    dlib::rand rnd;\n    for (int i = 0; i < 100; ++i) {\n        sample_type s;\n        s(0) = rnd.get_random_double();\n        s(1) = rnd.get_random_double();\n        samples.push_back(s);\n        labels.push_back(s(0) + s(1) > 1.0 ? 1.0 : -1.0);\n    }\n\n    // تدريب SVM مع نواة RBF\n    dlib::svm_c_ekm_trainer<dlib::kernel_type> trainer;\n    trainer.set_kernel(dlib::radial_basis_kernel<sample_type>(0.1));\n    auto decision_function = trainer.train(samples, labels);\n\n    // اختبار\n    sample_type test = {0.8, 0.7};\n    std::cout << "التنبؤ: " << decision_function(test) << std::endl;\n    return 0;\n}
\n

يدعم Dlib تسلسل النماذج، مما يسمح بحفظ النماذج المدربة وتحميلها في الإنتاج.

\n\n

3. استنتاج الشبكات العصبية بدون Python

\n

لتشغيل النماذج المدربة مسبقًا في C++، استخدم ONNX Runtime أو TensorFlow C++ API. مثال لتحميل نموذج ONNX:

\n
#include <onnxruntime/core/session/onnxruntime_cxx_api.h>\n#include <vector>\n\nint main() {\n    Ort::Env env(ORT_LOGGING_LEVEL_WARNING, "test");\n    Ort::SessionOptions session_options;\n    Ort::Session session(env, "model.onnx", session_options);\n\n    // تحضير بيانات الإدخال (مثال لصورة 3x224x224)\n    std::vector<float> input_tensor_values(3 * 224 * 224, 0.0f);\n    std::vector&l                

المدونات

توصيات الكتب