C++ 和機(jī)器學(xué)習(xí):使用 C++ 執(zhí)行 ML 任務(wù)的簡(jiǎn)介
C++ 和機(jī)器學(xué)習(xí):使用 C++ 執(zhí)行 ML 任務(wù)的簡(jiǎn)介
介紹
C++ 是一種高性能編程語(yǔ)言,非常適合機(jī)器學(xué)習(xí)( ML ) 任務(wù)。盡管它在 ML 中可能不像 Python 或 R 那樣流行,但它在速度和內(nèi)存效率方面具有優(yōu)勢(shì)。
在本文中,我們將概述使用 C++ 執(zhí)行 ML 任務(wù)。
C++ 中的 ML 庫(kù)
C++ 中有幾個(gè)用于機(jī)器學(xué)習(xí)的庫(kù),包括:
TensorFlow:TensorFlow 是由 Google 開(kāi)發(fā)的一個(gè)流行的 ML 庫(kù),用 C++ 和 Python 編寫(xiě)。TensorFlow 提供了一套廣泛的工具來(lái)構(gòu)建和部署 ML 模型,包括對(duì)深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)的支持。OpenCV:OpenCV 是一個(gè)用 C++ 編寫(xiě)的開(kāi)源計(jì)算機(jī)視覺(jué)庫(kù)。OpenCV 提供了廣泛的圖像和視頻處理工具,包括特征檢測(cè)、對(duì)象識(shí)別和人臉檢測(cè)。Dlib:Dlib 是一個(gè)用于機(jī)器學(xué)習(xí)的 C++ 庫(kù),由 Davis King 開(kāi)發(fā)。Dlib 提供了對(duì)象檢測(cè)、人臉識(shí)別和圖像處理等工具。LightGBM:LightGBM 是一個(gè)用 C++ 編寫(xiě)的快速且高性能的梯度提升庫(kù)。它為使用梯度提升算法構(gòu)建 ML 模型提供了可擴(kuò)展且高效的解決方案。XGBoost:XGBoost 是另一個(gè)用 C++ 編寫(xiě)的梯度提升庫(kù)。XGBoost 提供了用于構(gòu)建決策樹(shù)和樹(shù)集合的工具,使其成為解決復(fù)雜 ML 問(wèn)題的熱門(mén)選擇。Eigen:一個(gè)用于線性代數(shù)運(yùn)算的 C++ 庫(kù),通常在 ML 中用于矩陣計(jì)算。使用 C++ 進(jìn)行 ML 的優(yōu)勢(shì)
將 C++ 用于 ML 任務(wù)的一些優(yōu)勢(shì)包括:
速度:C++ 是一種編譯型語(yǔ)言,這意味著它可以比 Python 等解釋型語(yǔ)言更快地執(zhí)行代碼。內(nèi)存效率:C++ 是一種低級(jí)語(yǔ)言,可直接控制內(nèi)存使用,這在處理大型數(shù)據(jù)集時(shí)非常重要。可移植性:C++ 代碼可以在廣泛的平臺(tái)上編譯和運(yùn)行,使其成為構(gòu)建需要在不同操作系統(tǒng)上運(yùn)行的 ML 應(yīng)用程序的不錯(cuò)選擇。與現(xiàn)有代碼集成:C++ 通常用于金融和工程等行業(yè),其中可能存在需要與 ML 模型集成的現(xiàn)有代碼庫(kù)。將 C++ 用于 ML 的挑戰(zhàn)將 C++ 用于 ML 任務(wù)也會(huì)帶來(lái)一些挑戰(zhàn),包括:陡峭的學(xué)習(xí)曲線:C++ 是一種復(fù)雜的語(yǔ)言,需要大量的經(jīng)驗(yàn)和技能才能有效使用。缺乏庫(kù):雖然 C++ 中有幾個(gè)可用于 ML 的庫(kù),但生態(tài)系統(tǒng)不如 Python 豐富。缺乏靈活性:C++ 可能不如解釋型語(yǔ)言靈活,這使得嘗試不同的 ML 技術(shù)變得更加困難。調(diào)試:C++ 比解釋語(yǔ)言更難調(diào)試,因?yàn)樗且环N編譯語(yǔ)言。代碼復(fù)雜性:用 C++ 編寫(xiě)代碼可能比用解釋型語(yǔ)言編寫(xiě)代碼更復(fù)雜,因?yàn)?C++ 提供了對(duì)硬件的更多低級(jí)控制。使用 C++ 進(jìn)行機(jī)器學(xué)習(xí)的基本步驟
要將 C++ 用于 ML 任務(wù),你需要遵循以下基本步驟:
數(shù)據(jù)預(yù)處理:在此步驟中,你將通過(guò)清理、轉(zhuǎn)換和規(guī)范化數(shù)據(jù)來(lái)為機(jī)器學(xué)習(xí)任務(wù)準(zhǔn)備數(shù)據(jù)。模型構(gòu)建:接下來(lái),你將使用 TensorFlow 或 OpenCV 等 C++ 機(jī)器學(xué)習(xí)庫(kù)來(lái)構(gòu)建你的 ML 模型。你將定義模型的架構(gòu),指定優(yōu)化算法和損失函數(shù),并使用預(yù)處理數(shù)據(jù)訓(xùn)練模型。模型評(píng)估:訓(xùn)練模型后,你需要在單獨(dú)的測(cè)試集上評(píng)估其性能。此步驟可幫助你確定模型是否過(guò)度擬合或欠擬合訓(xùn)練數(shù)據(jù)。部署:一旦你有了一個(gè)在測(cè)試集上表現(xiàn)良好的模型,你就可以將它部署到生產(chǎn)環(huán)境中,它可以用來(lái)對(duì)新數(shù)據(jù)進(jìn)行預(yù)測(cè)。機(jī)器學(xué)習(xí)中的 C++ 示例
有幾個(gè) C++ 用于機(jī)器學(xué)習(xí)任務(wù)的示例,包括:
圖像識(shí)別:OpenCV 是一個(gè)流行的 C++ 庫(kù),用于計(jì)算機(jī)視覺(jué)任務(wù),包括圖像識(shí)別。它可用于為對(duì)象檢測(cè)、人臉識(shí)別和其他圖像識(shí)別任務(wù)構(gòu)建深度學(xué)習(xí)模型。自然語(yǔ)言處理( NLP ):C++ 可用于為文本分類、情感分析和語(yǔ)言翻譯等任務(wù)構(gòu)建 NLP 模型。TensorFlow 等庫(kù)可用于為 NLP 任務(wù)構(gòu)建神經(jīng)網(wǎng)絡(luò)模型。金融建模:C++ 通常用于金融領(lǐng)域,以構(gòu)建預(yù)測(cè)股票價(jià)格、信用風(fēng)險(xiǎn)和其他金融指標(biāo)的模型。像 Dlib 這樣的庫(kù)可用于為金融應(yīng)用程序構(gòu)建機(jī)器學(xué)習(xí)模型。使用 C++ 進(jìn)行機(jī)器學(xué)習(xí)的技巧
以下是一些可幫助你開(kāi)始使用 C++ 執(zhí)行 ML 任務(wù)的提示:
從一個(gè)庫(kù)開(kāi)始:C++ 中有幾個(gè)可用的機(jī)器學(xué)習(xí)庫(kù),例如 TensorFlow、OpenCV 和 Dlib。選擇一個(gè)最適合你需求的庫(kù),然后開(kāi)始使用該庫(kù)構(gòu)建你的 ML 模型。學(xué)習(xí) C++ 的基礎(chǔ)知識(shí):在深入學(xué)習(xí) ML 任務(wù)之前,請(qǐng)確保你對(duì) C++ 語(yǔ)言的基礎(chǔ)知識(shí)有很好的理解,例如數(shù)據(jù)類型、控制結(jié)構(gòu)和函數(shù)。使用可用資源:有多種資源可用于學(xué)習(xí) C++ 并將其用于 ML 任務(wù)。你可以參加在線課程、閱讀書(shū)籍或加入在線社區(qū)以獲得幫助和指導(dǎo)。試驗(yàn)不同的 ML 技術(shù):C++ 可能不如解釋型語(yǔ)言靈活,但它仍然允許你試驗(yàn)不同的 ML 技術(shù)。嘗試不同的優(yōu)化算法、損失函數(shù)和模型架構(gòu),以找到解決問(wèn)題的最佳方法。優(yōu)化代碼:C++ 提供對(duì)內(nèi)存使用的直接控制,因此請(qǐng)確保優(yōu)化代碼以減少內(nèi)存使用并提高性能。使用動(dòng)態(tài)內(nèi)存分配和指針等技術(shù)來(lái)減少內(nèi)存使用。不斷學(xué)習(xí):機(jī)器學(xué)習(xí)領(lǐng)域在不斷發(fā)展,新的技術(shù)和庫(kù)也在不斷發(fā)展。不斷學(xué)習(xí)并緊跟最新趨勢(shì),以保持該領(lǐng)域的競(jìng)爭(zhēng)力。
C++ 已經(jīng)存在了幾十年,并在游戲、金融和電信等多個(gè)行業(yè)證明了它的價(jià)值。近年來(lái),隨著 AI 和 ML 的出現(xiàn),C++ 被更頻繁地用于構(gòu)建高性能 ML 模型。隨著對(duì)能夠處理大量數(shù)據(jù)并提供實(shí)時(shí)預(yù)測(cè)的 ML 模型的需求不斷增加,C++ 有望在 ML 的未來(lái)發(fā)揮重要作用。
下面是一個(gè)使用 Tensorflow 創(chuàng)建和運(yùn)行簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)的 C++ 代碼的簡(jiǎn)單示例:
#include
#include "tensorflow/core/public/session.h"
#include "tensorflow/core/platform/env.h"
using namespace std;
using namespace tensorflow;
int main()
{
// Create a graph for the neural network
GraphDef graph_def;
Status status = ReadBinaryProto(Env::Default(), "model.pb", &graph_def);
if (!status.ok()) {
cerr << "Error reading graph definition: " << status.ToString() << endl;
return 1;
}
// Create a new Tensorflow session and load the graph
SessionOptions session_options;
Session* session = NewSession(session_options);
status = session->Create(graph_def);
if (!status.ok()) {
cerr << "Error creating Tensorflow session: " << status.ToString() << endl;
return 1;
}
// Define the input and output tensors
Tensor input_tensor(DT_FLOAT, TensorShape({1, 2}));
input_tensor.flat
input_tensor.flat
vector<pair<string, Tensor>> inputs = {
{"input_tensor", input_tensor},
};
vector
// Run the graph
vector
status = session->Run(inputs, output_names, {}, &outputs);
if (!status.ok()) {
cerr << "Error running session: " << status.ToString() << endl;
return 1;
}
// Print the output tensor value
const auto& output_tensor = outputs[0];
cout << "Output tensor value: " << output_tensor.flat
// Clean up
session->Close();
delete session;
return 0;
}
此代碼假定你已經(jīng)創(chuàng)建了 Tensorflow 模型并將其保存為 protobuf 文件(例如,model.pb)。代碼從此文件加載圖形定義,創(chuàng)建新的 Tensorflow 會(huì)話,并使用指定的輸入張量運(yùn)行圖形。最后,代碼打印輸出張量的值。
請(qǐng)注意,編譯時(shí)需要將 C++ 代碼與 Tensorflow 庫(kù)鏈接起來(lái)。例如,如果你已經(jīng)使用安裝了Tensorflow pip,你可以使用下面的命令來(lái)編譯上面的代碼:
g++ -std=c++11 -I/usr/local/lib/python3.9/dist-packages/tensorflow/include -L/usr/local/lib/python3.9/dist-packages/tensorflow -ltensorflow_cc -ltensorflow_framework example.cpp -o example
注意上面的編譯命令假設(shè)你已經(jīng)安裝了Tensorflow using pip并且正在使用Linux系統(tǒng)。該命令可能需要根據(jù)你的安裝和系統(tǒng)進(jìn)行調(diào)整。
為了在 C++ 中使用 Tensorflow 創(chuàng)建你自己的神經(jīng)網(wǎng)絡(luò),你需要使用 Tensorflow 的 C++ API 定義網(wǎng)絡(luò)圖。
下面是一個(gè)示例,說(shuō)明如何定義具有一個(gè)隱藏層的簡(jiǎn)單全連接神經(jīng)網(wǎng)絡(luò):
#include
#include "tensorflow/core/framework/tensor.h"
#include "tensorflow/core/framework/tensor_shape.h"
#include "tensorflow/core/framework/types.pb.h"
#include "tensorflow/core/graph/default_device.h"
#include "tensorflow/core/graph/graph_def_builder.h"
#include "tensorflow/core/graph/node_builder.h"
#include "tensorflow/core/lib/core/errors.h"
#include "tensorflow/core/lib/core/stringpiece.h"
#include "tensorflow/core/lib/core/threadpool.h"
#include "tensorflow/core/lib/gtl/array_slice.h"
#include "tensorflow/core/lib/gtl/inlined_vector.h"
#include "tensorflow/core/platform/init_main.h"
#include "tensorflow/core/platform/logging.h"
#include "tensorflow/core/platform/types.h"
#include "tensorflow/core/public/session.h"
using namespace std;
using namespace tensorflow;
int main()
{
// Create a graph for the neural network
GraphDef graph_def;
auto options = SessionOptions();
options.config.mutable_gpu_options()->set_allow_growth(true);
auto session = NewSession(options);
auto root = tensorflow::Scope::NewRootScope();
auto input_tensor = Placeholder(root.WithOpName("input_tensor"), DT_FLOAT, Placeholder::Shape({1, 2}));
auto w1_tensor = Variable(root.WithOpName("w1"), {2, 4}, DT_FLOAT);
auto b1_tensor = Variable(root.WithOpName("b1"), {1, 4}, DT_FLOAT);
auto hidden_tensor = Add(root.WithOpName("hidden"), MatMul(root.WithOpName("matmul"), input_tensor, w1_tensor), b1_tensor);
auto w2_tensor = Variable(root.WithOpName("w2"), {4, 1}, DT_FLOAT);
auto b2_tensor = Variable(root.WithOpName("b2"), {1, 1}, DT_FLOAT);
auto output_tensor = Add(root.WithOpName("output"), MatMul(root.WithOpName("matmul2"), hidden_tensor, w2_tensor), b2_tensor);
auto graph_status = root.ToGraphDef(&graph_def);
if (!graph_status.ok()) {
cerr << "Error creating graph definition: " << graph_status.ToString() << endl;
return 1;
}
auto session_status = session->Create(graph_def);
if (!session_status.ok()) {
cerr << "Error creating Tensorflow session: " << session_status.ToString() << endl;
return 1;
}
// Define the input tensor and run the graph
Tensor input_data(DT_FLOAT, TensorShape({1, 2}));
input_data.flat
input_data.flat
vector<pair<string, Tensor>> inputs = {
{"input_tensor", input_data},
};
vector
vector
auto run_status = session->Run(inputs, output_names, {}, &outputs);
if (!run_status.ok()) {
cerr << "Error running session: " << run_status.ToString() << endl;
return 1;
}
// Print the output tensor value
const auto& output_tensor = outputs[0];
cout << "Output tensor value: " << output_tensor.flat
return 0;
}
上面的代碼是使用Tensorflow C++ API 定義的帶有一個(gè)隱藏層的全連接神經(jīng)網(wǎng)絡(luò)示例。網(wǎng)絡(luò)的輸入張量形狀為 (1, 2),輸出張量形狀為 (1, 1)。網(wǎng)絡(luò)的隱藏層有四個(gè)單元,使用 ReLU 激活函數(shù)。網(wǎng)絡(luò)是使用各種 Tensorflow 操作定義的,例如Add、MatMul和Placeholder。
定義神經(jīng)網(wǎng)絡(luò)圖后,代碼會(huì)創(chuàng)建一個(gè) Tensorflow 會(huì)話來(lái)運(yùn)行該圖。然后將輸入數(shù)據(jù)輸入到圖中,并執(zhí)行該圖以檢索輸出張量。
要使用此代碼,你需要安裝Tensorflow C++ 庫(kù)并將相關(guān)的頭文件包含在你的 C++ 代碼中。編譯代碼時(shí),還需要鏈接到 Tensorflow C++ 庫(kù)。
結(jié)論總之,將 C++ 用于機(jī)器學(xué)習(xí)任務(wù)可能是一種具有挑戰(zhàn)性但有益的體驗(yàn)。C++ 提供對(duì)內(nèi)存使用的直接控制,使其比解釋型語(yǔ)言的內(nèi)存效率更高,并且它提供速度和可移植性,使其成為構(gòu)建高性能 ML 模型的合適選擇。但是,將 C++ 用于 ML 任務(wù)需要在學(xué)習(xí)語(yǔ)言和使用可用庫(kù)方面進(jìn)行大量投資。
如果你是一名希望學(xué)習(xí) C++ 來(lái)完成 ML 任務(wù)的程序員,我們建議你從 TensorFlow 或 OpenCV 等庫(kù)開(kāi)始,并學(xué)習(xí)該語(yǔ)言的基礎(chǔ)知識(shí)。試驗(yàn)不同的 ML 技術(shù)并優(yōu)化你的代碼以減少內(nèi)存使用并提高性能。隨著 ML 領(lǐng)域的不斷發(fā)展,C++ 有望在高性能 ML 模型的開(kāi)發(fā)中發(fā)揮重要作用。
原文標(biāo)題 : C++ 和機(jī)器學(xué)習(xí):使用 C++ 執(zhí)行 ML 任務(wù)的簡(jiǎn)介

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車】汽車E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書(shū)】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開(kāi)始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺(tái)
- 5 國(guó)產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來(lái)商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽(yáng)光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開(kāi)成長(zhǎng)空間
- 8 地平線自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營(yíng)收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?