Машинное обучение на C++: обзор ключевых библиотек

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Машинное обучение на C++: обзор ключечных библиотек

Хотя Python стал стандартом де-факто для исследований и быстрого прототипирования в области машинного обучения (ML), C++ остается незаменимым языком для production-систем, где критичны производительность, низкое потребление памяти и работа в real-time. C++ позволяет выжать максимум из аппаратного обеспечения, что особенно важно при развертывании моделей на мобильных устройствах, встраиваемых системах или высоконагруженных серверах.

В этой статье мы рассмотрим пять ведущих библиотек машинного обучения для C++, их сильные стороны, типичные用例 и приведем практические примеры кода. Вы узнаете, какую библиотеку выбрать для классификации, регрессии, кластеризации, работы с нейросетями или обработки сигналов.

1. TensorFlow C++ API — мощь глубокого обучения

TensorFlow — одна из самых популярных фреймворков для глубокого обучения. Его C++ API позволяет загружать предварительно обученные модели (например, из Python) и выполнять инференс с максимальной скоростью. Это идеальный выбор для встраиваемых систем (Raspberry Pi, Jetson Nano, Android) и production-серверов.

Основные возможности:

  • Работа с сохраненными графами вычислений (SavedModel, Frozen Graph).
  • Поддержка GPU через CUDA и cuDNN.
  • Оптимизация модели под конкретное устройство (XLA, Quantization).

Пример загрузки и запуска модели (инференс):

#include <tensorflow/core/public/session.h>
#include <tensorflow/core/platform/env.h>

using namespace tensorflow;

int main() {
    // Создаем сессию
    Session* session;
    NewSession(SessionOptions(), &session);

    // Загружаем граф из файла
    GraphDef graph_def;
    Status status = ReadBinaryProto(Env::Default(), "model.pb", &graph_def);
    if (!status.ok()) { /* обработка ошибки */ }

    // Добавляем граф в сессию
    session->Create(graph_def);

    // Подготавливаем входные данные (тензор)
    Tensor input_tensor(DT_FLOAT, TensorShape({1, 224, 224, 3}));
    auto input_map = input_tensor.tensor<float, 4>();
    // ... заполняем тензор данными ...

    // Выполняем инференс
    std::vector<Tensor> outputs;
    session->Run({{"input_tensor", input_tensor}}, {"output_tensor"}, {}, &outputs);

    // Используем результат
    auto result = outputs[0].tensor<float, 2>();
    std::cout << "Prediction: " << result(0, 0) << std::endl;

    session->Close();
    return 0;
}

2. Dlib — универсальный инструмент для ML и Computer Vision

Dlib — библиотека общего назначения, которая включает как классические алгоритмы машинного обучения (SVM, решающие деревья, K-means), так и современные глубокие нейронные сети. Особенно сильна в задачах компьютерного зрения: детекция лиц, трекинг объектов, распознавание лиц (FaceNet).

Ключевые особенности:

  • Простая интеграция: header-only для большинства функций.
  • Встроенная поддержка многопоточности (thread_pool).
  • Готовые утилиты для обработки изображений и матричных операций.

Пример обучения SVM-классификатора:

#include <dlib/svm.h>
#include <dlib/rand.h>

using namespace dlib;

int main() {
    // Тип ядра: радиальная базисная функция (RBF)
    typedef radial_basis_kernel<sample_type> kernel_type;

    // Создаем классификатор и тренера
    svm_c_trainer<kernel_type> trainer;
    trainer.set_kernel(kernel_type(0.1));

    // Обучающие данные
    std::vector<sample_type> samples;
    std::vector<double> labels;
    // ... заполняем samples и labels ...

    // Обучение
    decision_function<kernel_type> df = trainer.train(samples, labels);

    // Тестируем новый образец
    sample_type new_sample;
    // ... заполняем ...
    double prediction = df(new_sample);
    std::cout << "Predicted class: " << prediction << std::endl;
    return 0;
}

3. Shark — гибкая библиотека для исследований

Shark — библиотека с открытым исходным кодом, ориентированная на исследовательские задачи. Она предлагает широкий спектр алгоритмов: от линейной регрессии до глубоких нейронных сетей (с поддержкой GPU через Boost.Compute). Shark известна своей модульной архитектурой и поддержкой различных стратегий оптимизации (SGD, L-BFGS, Rprop).

Сильные стороны

Рекомендаций