Apprentissage automatique en C++ : aperçu des bibliothèques clés
Bien que Python soit devenu la norme de facto pour la recherche et le prototypage rapide dans le domaine de l'apprentissage automatique (ML), le C++ reste un langage indispensable pour les systèmes de production où les performances, la faible consommation de mémoire et le travail en temps réel sont critiques. Le C++ permet de tirer le meilleur parti du matériel, ce qui est particulièrement important lors du déploiement de modèles sur des appareils mobiles, des systèmes embarqués ou des serveurs à forte charge.
Dans cet article, nous examinerons cinq bibliothèques d'apprentissage automatique de premier plan pour le C++, leurs points forts, leurs cas d'utilisation typiques et fournirons des exemples de code pratiques. Vous découvrirez quelle bibliothèque choisir pour la classification, la régression, le clustering, le travail avec les réseaux de neurones ou le traitement du signal.
1. TensorFlow C++ API — la puissance de l'apprentissage profond
TensorFlow est l'un des frameworks les plus populaires pour l'apprentissage profond. Son API C++ permet de charger des modèles pré-entraînés (par exemple, depuis Python) et d'effectuer l'inférence à une vitesse maximale. C'est un choix idéal pour les systèmes embarqués (Raspberry Pi, Jetson Nano, Android) et les serveurs de production.
Principales fonctionnalités :
- Travail avec des graphes de calcul sauvegardés (SavedModel, Frozen Graph).
- Prise en charge du GPU via CUDA et cuDNN.
- Optimisation du modèle pour un appareil spécifique (XLA, Quantization).
Exemple de chargement et d'exécution d'un modèle (inférence) :
#include <tensorflow/core/public/session.h>#include <tensorflow/core/platform/env.h>
using namespace tensorflow;
int main() { // Créer une session Session* session; NewSession(SessionOptions(), &session);
// Charger le graphe depuis un fichier GraphDef graph_def; Status status = ReadBinaryProto(Env::Default(), "model.pb", &graph_def); if (!status.ok()) { /* gestion d'erreur */ }
// Ajouter le graphe à la session session->Create(graph_def);
// Préparer les données d'entrée (tenseur) Tensor input_tensor(DT_FLOAT, TensorShape({1, 224, 224, 3})); auto input_map = input_tensor.tensor<float, 4>(); // ... remplir le tenseur avec des données ...
// Effectuer l'inférence std::vector<Tensor> outputs; session->Run({{"input_tensor", input_tensor}}, {"output_tensor"}, {}, &outputs);
// Utiliser le résultat auto result = outputs[0].tensor<float, 2>(); std::cout << "Prediction: " << result(0, 0) << std::endl;
session->Close(); return 0;}2. Dlib — un outil polyvalent pour le ML et la vision par ordinateur
Dlib est une bibliothèque à usage général qui comprend à la fois des algorithmes classiques d'apprentissage automatique (SVM, arbres de décision, K-means) et des réseaux de neurones profonds modernes. Elle est particulièrement performante dans les tâches de vision par ordinateur : détection de visages, suivi d'objets, reconnaissance faciale (FaceNet).
Caractéristiques clés :
- Intégration simple : header-only pour la plupart des fonctions.
- Prise en charge intégrée du multithreading (thread_pool).
- Utilitaires prêts à l'emploi pour le traitement d'images et les opérations matricielles.
Exemple d'entraînement d'un classifieur SVM :
#include <dlib/svm.h>#include <dlib/rand.h>
using namespace dlib;
int main() { // Type de noyau : fonction de base radiale (RBF) typedef radial_basis_kernel<sample_type> kernel_type;
// Créer le classifieur et l'entraîneur svm_c_trainer<kernel_type> trainer; trainer.set_kernel(kernel_type(0.1));
// Données d'entraînement std::vector<sample_type> samples; std::vector<double> labels; // ... remplir samples et labels ...
// Entraînement decision_function<kernel_type> df = trainer.train(samples, labels);
// Tester un nouvel échantillon