機(jī)器學(xué)習(xí)是一門復(fù)雜的學(xué)科,但由于機(jī)器學(xué)習(xí)框架(例如Google 的 TensorFlow)簡(jiǎn)化了獲取數(shù)據(jù)、訓(xùn)練模型、提供預(yù)測(cè)和改進(jìn)未來結(jié)果的過程,實(shí)現(xiàn)機(jī)器學(xué)習(xí)遠(yuǎn)沒有以前那么令人生畏。
TensorFlow 由 Google Brain 團(tuán)隊(duì)創(chuàng)建,最初于 2015 年向公眾發(fā)布,是一個(gè)用于數(shù)值計(jì)算和大規(guī)模機(jī)器學(xué)習(xí)的開源庫(kù)。TensorFlow 將大量機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型和算法(也稱為神經(jīng)網(wǎng)絡(luò))捆綁在一起,并通過常見的編程隱喻使它們變得有用。它使用 Python 或 JavaScript 為構(gòu)建應(yīng)用程序提供方便的前端 API,同時(shí)在高性能 C++ 中執(zhí)行這些應(yīng)用程序。
TensorFlow與 PyTorch和 Apache MXNet 等框架競(jìng)爭(zhēng),可以訓(xùn)練和運(yùn)行深度神經(jīng)網(wǎng)絡(luò),用于手寫數(shù)字分類、圖像識(shí)別、詞嵌入、循環(huán)神經(jīng)網(wǎng)絡(luò)、用于機(jī)器翻譯的序列到序列模型、自然語(yǔ)言處理和基于 PDE(偏微分方程)的模擬。最重要的是,TensorFlow 支持大規(guī)模生產(chǎn)預(yù)測(cè),使用相同的模型進(jìn)行訓(xùn)練。
TensorFlow 還擁有廣泛的預(yù)訓(xùn)練模型庫(kù),可用于你自己的項(xiàng)目。你還可以使用TensorFlow 模型園中的代碼 作為訓(xùn)練你自己的模型的最佳實(shí)踐示例。
TensorFlow 的工作原理
TensorFlow 允許開發(fā)人員創(chuàng)建數(shù)據(jù)流圖——描述數(shù)據(jù)如何通過圖或一系列處理節(jié)點(diǎn)移動(dòng)的結(jié)構(gòu)。圖中的每個(gè)節(jié)點(diǎn)都代表一個(gè)數(shù)學(xué)運(yùn)算,節(jié)點(diǎn)之間的每個(gè)連接或邊都是一個(gè)多維數(shù)據(jù)數(shù)組,或稱張量。
TensorFlow 應(yīng)用程序可以在大多數(shù)方便的目標(biāo)上運(yùn)行:本地機(jī)器、云中的集群、iOS 和 Android 設(shè)備、CPU 或 GPU。如果你使用 Google 自己的云,你可以在 Google 的自定義TensorFlow 處理單元(TPU) 芯片上運(yùn)行 TensorFlow,以進(jìn)一步加速。不過,TensorFlow 創(chuàng)建的結(jié)果模型可以部署在大多數(shù)用于提供預(yù)測(cè)的設(shè)備上。
TensorFlow 2.0 于 2019 年 10 月發(fā)布,根據(jù)用戶反饋對(duì)框架進(jìn)行了多種改進(jìn),使其更易于使用(例如,通過使用相對(duì)簡(jiǎn)單的 Keras API 進(jìn)行模型訓(xùn)練)和更高的性能。得益于新的 API,分布式訓(xùn)練更易于運(yùn)行,并且對(duì) TensorFlow Lite 的支持使在更多種類的平臺(tái)上部署模型成為可能。但是,必須重寫為早期版本的 TensorFlow 編寫的代碼——有時(shí)只是輕微的,有時(shí)是顯著的——以最大限度地利用新的 TensorFlow 2.0 功能。
經(jīng)過訓(xùn)練的模型可用于 通過 使用 REST 或gRPC API的 Docker 容器將預(yù)測(cè)作為服務(wù)提供。對(duì)于更高級(jí)的服務(wù)場(chǎng)景,你可以使用Kubernetes
將 TensorFlow 與 Python 結(jié)合使用
TensorFlow 通過 Python 語(yǔ)言為程序員提供了所有這些功能。Python 易于學(xué)習(xí)和使用,它提供了方便的方法來表達(dá)如何將高級(jí)抽象耦合在一起。TensorFlow 在 Python 3.7 到 3.10 版本上受支持,雖然它可以在早期版本的 Python 上工作,但不能保證這樣做。
TensorFlow 中的節(jié)點(diǎn)和張量是 Python 對(duì)象,TensorFlow 應(yīng)用程序本身就是 Python 應(yīng)用程序。然而,實(shí)際的數(shù)學(xué)運(yùn)算并不是在 Python 中執(zhí)行的。通過 TensorFlow 提供的轉(zhuǎn)換庫(kù)被編寫為高性能 C++ 二進(jìn)制文件。Python 只是引導(dǎo)各個(gè)部分之間的流量,并提供高級(jí)編程抽象來將它們連接在一起。
TensorFlow 中的高級(jí)工作(創(chuàng)建節(jié)點(diǎn)和層并將它們鏈接在一起)使用Keras庫(kù)。Keras API 表面上很簡(jiǎn)單;一個(gè)三層的基本模型可以在不到 10 行代碼中定義,同樣的訓(xùn)練代碼只需要幾行代碼。但如果你想“揭開面紗”,做更細(xì)粒度的工作,比如編寫自己的訓(xùn)練循環(huán),你可以這樣做。
將 TensorFlow 與 JavaScript 結(jié)合使用
Python 是與 TensorFlow 和機(jī)器學(xué)習(xí)一起工作的最流行的語(yǔ)言。但是 JavaScript 現(xiàn)在也是 TensorFlow 的一流語(yǔ)言,JavaScript 的巨大優(yōu)勢(shì)之一是它可以在任何有網(wǎng)絡(luò)瀏覽器的地方運(yùn)行。
TensorFlow.js(稱為 JavaScript TensorFlow 庫(kù))使用 WebGL API 通過系統(tǒng)中可用的任何 GPU 來加速計(jì)算。也可以使用WebAssembly后端來執(zhí)行,如果你只在 CPU 上運(yùn)行,它比常規(guī)的 JavaScript 后端更快,但最好盡可能使用 GPU。預(yù)建模型讓你可以啟動(dòng)并運(yùn)行簡(jiǎn)單的項(xiàng)目,讓你了解事情的運(yùn)作方式。
TensorFlow 精簡(jiǎn)版
經(jīng)過訓(xùn)練的 TensorFlow 模型也可以部署在邊緣計(jì)算或移動(dòng)設(shè)備上,例如 iOS 或 Android 系統(tǒng)。TensorFlow Lite工具集通過允許你在模型大小和準(zhǔn)確性之間進(jìn)行權(quán)衡,優(yōu)化 TensorFlow 模型以在此類設(shè)備上良好運(yùn)行。較小的模型(即 12MB 對(duì) 25MB,甚至 100+MB)的準(zhǔn)確度較低,但準(zhǔn)確度的損失通常很小,并且被模型的速度和能效所抵消。
為什么使用 TensorFlow
TensorFlow 為機(jī)器學(xué)習(xí)開發(fā)提供的最大好處是抽象。開發(fā)人員可以專注于整體應(yīng)用程序邏輯,而不是處理實(shí)現(xiàn)算法的細(xì)節(jié),或者找出將一個(gè)函數(shù)的輸出連接到另一個(gè)函數(shù)的輸入的正確方法。TensorFlow 負(fù)責(zé)幕后的細(xì)節(jié)。
TensorFlow 為需要調(diào)試和了解 TensorFlow 應(yīng)用程序的開發(fā)人員提供了更多便利。每個(gè)圖形操作都可以單獨(dú)且透明地進(jìn)行評(píng)估和修改,而不是將整個(gè)圖形構(gòu)建為單個(gè)不透明對(duì)象并立即對(duì)其進(jìn)行評(píng)估。這種所謂的“急切執(zhí)行模式”作為舊版 TensorFlow 的一個(gè)選項(xiàng)提供,現(xiàn)在已成為標(biāo)準(zhǔn)。
TensorBoard可視化套件可讓你通過基于 Web 的交互式儀表板檢查和分析圖表的運(yùn)行方式。Tensorboard.dev服務(wù) (由 Google 托管)可讓你托管和共享用 TensorFlow 編寫的機(jī)器學(xué)習(xí)實(shí)驗(yàn)。它可以免費(fèi)用于存儲(chǔ)多達(dá) 100M 的標(biāo)量、1GB 的張量數(shù)據(jù)和 1GB 的二進(jìn)制對(duì)象數(shù)據(jù)。(請(qǐng)注意,托管在 Tensorboard.dev 中的任何數(shù)據(jù)都是公開的,因此請(qǐng)勿將其用于敏感項(xiàng)目。)
TensorFlow 還從谷歌一流商業(yè)機(jī)構(gòu)的支持中獲得了許多優(yōu)勢(shì)。谷歌推動(dòng)了該項(xiàng)目的快速發(fā)展,并創(chuàng)造了許多重要的產(chǎn)品,使 TensorFlow 更易于部署和使用。上述用于在谷歌云中加速性能的 TPU 芯片只是一個(gè)例子。
使用 TensorFlow 進(jìn)行確定性模型訓(xùn)練
TensorFlow 實(shí)現(xiàn)的一些細(xì)節(jié)使得某些訓(xùn)練作業(yè)很難獲得完全確定的模型訓(xùn)練結(jié)果。有時(shí),在一個(gè)系統(tǒng)上訓(xùn)練的模型與在另一個(gè)系統(tǒng)上訓(xùn)練的模型會(huì)略有不同,即使它們提供了完全相同的數(shù)據(jù)。這種差異的原因很棘手——一個(gè)原因是隨機(jī)數(shù)是如何播種的以及在哪里播種;另一個(gè)與使用 GPU 時(shí)的某些非確定性行為有關(guān)。TensorFlow 的 2.0 分支有一個(gè)選項(xiàng),可以通過幾行代碼在整個(gè)工作流程中啟用確定性。但是,此功能以性能為代價(jià),并且僅應(yīng)在調(diào)試工作流時(shí)使用。
TensorFlow 與 PyTorch、CNTK 和 MXNet
TensorFlow 與許多其他機(jī)器學(xué)習(xí)框架競(jìng)爭(zhēng)。PyTorch、CNTK 和 MXNet 是滿足許多相同需求的三個(gè)主要框架。讓我們快速了解一下它們?cè)谀男┓矫婷摲f而出并與 TensorFlow 相比不足:
- PyTorch是用 Python 構(gòu)建的,并且與 TensorFlow 有許多其他相似之處:引擎蓋下的硬件加速組件、允許即用即設(shè)計(jì)工作的高度交互的開發(fā)模型,以及已經(jīng)包含許多有用的組件。對(duì)于需要在短時(shí)間內(nèi)啟動(dòng)并運(yùn)行的項(xiàng)目的快速開發(fā),PyTorch通常是更好的選擇,但 TensorFlow 更適合大型項(xiàng)目和更復(fù)雜的工作流程。
- CNTK是 Microsoft Cognitive Toolkit,在使用圖結(jié)構(gòu)來描述數(shù)據(jù)流方面與 TensorFlow 類似,但它主要側(cè)重于創(chuàng)建深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)。CNTK可以更快地處理許多神經(jīng)網(wǎng)絡(luò)作業(yè),并擁有更廣泛的 API(Python、C++、C#、Java)。但目前它不像 TensorFlow 那樣容易學(xué)習(xí)或部署。它也僅在 GNU GPL 3.0 許可下可用,而 TensorFlow 在更自由的 Apache 許可下可用。而且 CNTK 沒有那么積極的發(fā)展。上一個(gè)主要版本是在 2019 年。
- Apache MXNet被 Amazon 采用為 AWS 上的首要深度學(xué)習(xí)框架,可以在多個(gè) GPU 和多臺(tái)機(jī)器上幾乎線性擴(kuò)展。MXNet還支持廣泛的語(yǔ)言 API——Python、C++、Scala、R、JavaScript、Julia、Perl、Go——盡管它的原生 API 不像 TensorFlow 那樣好用。它還擁有一個(gè)小得多的用戶和開發(fā)人員社區(qū)。
原文標(biāo)題:??What is TensorFlow? The machine learning library explained??