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