TensorFlow簡介
本節將從五個方面對 TensorFlow 進行一個簡單的介紹。包括 TensorFlow 是什么、為什么選擇TensorFlow、TensorFlow 的發展、TensorFlow 能干什么以及 TensorFlow 的核心理念。
- 什么是 TenosrFlow
TensorFlow 是一個開源軟件庫,用於各種感知和語言理解任務的機器學習。—— Wiki 百科
這種過於官方化的定義可能比較難於理解,我們在這里給出一個比較容易理解的解釋:TensorFlow 是一個開源的機器學習的框架,我們可以使用 TensorFlow 來快速地構建神經網絡,同時快捷地進行網絡的訓練、評估與保存。
也正是因為 TensorFlow 是一個開源的軟件庫,因此只要我們安裝了 TensorFlow,我們就可以使用import 的方式來引入。
import tensorflow as tf
- 為什么選擇 TensorFlow 以及優缺點
談到為什么選擇 TensorFlow,有很多同學就會問“為什么不使用 PyTorch?”、“為什么不自己實現網絡而必須使用框架呢?”等等一系列問題。
首先我們回答“為什么不自己去實現網絡結構而必須使用框架”的問題:
實際上如果有能力實現神經網絡結構,我們完全可以自己動手實現我們所需要的神經網絡,但是這樣會帶來一個問題:工作量太大,我們會把我們大部分的精力花費在底層的構建而不是主要的模型的構建上。
在當下的潮流之中,使用框架是大勢所趨,使用框架能夠幫助我們節省很多的底層的、繁瑣的、容易出錯的工作。比如在 Web 開發之中會使用 Django 和 Spring Boot 等框架,在桌面開發中會使用 MFC、QT 等框架,而在機器學習領域我們可以選擇使用 TensoFlow 框架。
另外通過使用框架,我們可以把我們的精力更多的放在上層的模型的構建之上,一方面可以幫助我們專注於高層次的工作,另一方面又可以幫助我們避免底級的一些錯誤。
現在我們可以回答第二個問題,為什么不使用其他的機器學習框架?
說到這里我們不得不說一下 TensorFlow 的優點,相比於其他的機器學習框架,Tensorflow 框架是最適用於工業部署的一個機器學習框架,換句話說,TensorFlow 非常適用於在生產環境中進行應用。下面我們來細數一下 TensorFlow 的優點。
- 整個項目開源;
- 文檔非常全面而且包含中文教程,學習成本比較低;
- 其內部含有很多高階神經網絡API,我們可以用一個語句來生產一個網絡;
- 使用其內部的TensorFlow Service可以實現快速上線部署;
- 得益於高階API,使用TensorFlow進行神經網絡開發非常迅速;
- 內部內置TesnorBoard工具,可以很好的進行可視化工作;
- 對移動設備的支持非常友好;
- TensorFlow內部內置分布式訓練工具,開源很方便地進行分布式訓練。
討論了這么多優點,TensorFlow 就沒有缺點嗎?當然有,TensorFlow 也有一些顯而易見的缺點:
- TensorFlow程序的調試較為困難,我們不能深入其內部進行調試;
- TensorFlow的許多高階API導致我們修改我們自己的模型比較困難(相對而言);
- TensorFlow1.x與TensorFlow2.x的差別比較大,以前的代碼遷移比較困難。
總結來說,如果你想進行神經網絡的快速構建、訓練與部署,那么 TensorFlow 是你非常好的選擇,但是如果你想從事一些科研的方面的工作,那么 TensorFlow 可能並沒有 Pytorch 那么容易駕馭。
- TensoFlow的發展
很多人都知道 TensorFlow 是從 1.x 版本發展到 2.x 版本的,而且目前網絡上很多 TensorFlow 的教程都還停留在 TensorFlow1.x 階段。在這里,我便帶領大家回顧一下 TensorFlow 的發展歷程:
- 從 2010 年開始,谷歌大腦團隊便在其內部使用 DistBelief 框架進行機器學習的相關工作,后來經過不斷地簡化與重構逐漸形成了 TesnorFlow,這便是 TensorFlow 的前身,但是此時的 TensorFlow還沒有開源;
- 2015 年,年輕的 TensorFlow 正式開源,此時的 TensorFlow 依然處在 0.x 的非正式版本;
- 一直到 2016 年 12 月期間,TensorFlow 逐漸支持了分布式、移動設備 與Windows 系統;
- 2017 年,TensorFlow 正式發布了 1.0.0 版本,由此 TensorFlow 正式版發布;
- 直到 2019 年期間,TensorFlow 逐步加入了 TPU、張量處理單元等工具;
- 2019 年 10 月,TensorFlow2.0 正式發布,這也標志着 TensorFlow 進入了 2.0 時代。
在當前,TensorFlow 的最新穩定版本為 2.2 版本。
由於 TensorFlow1.x 與 TensorFlow2.x 的差別較大,因此在我們的學習與使用當中,我們應當首先學習TensorFlow2.x 版本。相比於T ensorFlow1.x,TensorFlow2.x 最大的優點就是加入了 Keras,而TensorFLow 也是默認采用 Eager 模式來構建我們的模型,這對於一些初學者來說是巨大的福音,而這在TensorFlow1.x時代是沒有辦法實現的。
依托於谷歌強大的影響與號召力,TenorFlow 的用戶群體非常巨大,而且使用 TensorFlow 得到的訓練結果非常優秀,對於機器學習的初學者來說,這確實是一件不可多得的珍寶。
- TensorFlow能干什么
其實這個問題在前面的概念中已經涉及了,TensorFlow主要負責機器學習的每一個步驟,包括:
- 模型的構建;
- 模型的訓練;
- 模型的保存與加載;
- 模型的評估;
- 使用加速器提升性能;
- 在生產環境中部署網絡;
- 對模型的數據進行可視化(TensorBoard);
- 其他功能。
通過這樣的梳理我們可以發現,TensorFlow 可以滿足我們在機器學習中的從模型構建到模型的部署的絕大部分的工作需求。
- TensorFlow的核心理念
前面介紹了這么多,我們現在可以深入 TensorFlow 內部來簡單了解一下 TensorFlow 的核心理念。
簡單來說, TensorFlow 的核心理念包括計算圖與張量(Tensor)。
5.1 計算圖
在 TensorFlow 中,我們首先構建模型,TensorFLow會根據我們的模型來構建一個計算圖,然后TensorFLow 會在該計算圖中進行相應的運算、迭代與求梯度等操作,從而得到我們最終想要的結果。
下面是一個 TensorFlow 模型的計算圖,目前諸位同學可以將其理解為模型圖或者數據流動圖。
該圖為在 TensorBoard 之中得到的計算圖,其中的節點表示運算或者網絡層,而線條表示數據流動。
值得一提的是,在 TensorFLow1.x 版本中計算圖是與會話結合在一起的,在TensorFLow2.x之中我們不需要手動啟動會話,但是計算圖仍然是 TensorFlow 的核心概念之一。
5.2 張量
張量(Tensor)就是 TensorFlow 的名字的由來之一,TensorFLow 顧名思義就是張量流動的意思,由此可見張量為 TensorFlow 的最核心的概念之一。
張量在TensorFLow之中以數組的形式存儲,張量的主要組成要素包括:
- 名稱(name);
- 形狀(shape);
- 類型(dtype)。
簡單的理解,我們可以將張量看作多維數組,因為是多維數組,因此可以包含三維或者三維以上的維度,對於初學者來說可能不是特別友好。
在 TensorFLow 之中我們可以很輕松的構建一個張量,比如以下代碼:
x = tf.ones((64, 28, 28, 3))
由此我們構建了一個思維張量,他的第一維是 64 個維度,第二維與第三維都是 28 個維度,第四維是3 個維度。
對於二維張量,我們可以理解為一個平面;對於三位數據,我們可以理解為一個空間;而對於四維數據我們可以理解為一個在三維空間的外面又增加了一個維度;五維張量則是又增加一個維度......
在TensorFlow之中我們一般將第一維數據作為批大小來處理(Batch_Size),也就是一批數據中含有多少個樣本子數據。更一般的,在不確定批大小的情況下,我們直接將第一維設置為 None,比如:
x = tf.ones((None, 28 ,28, 3))
總結
TensorFlow 是一個相對比較完整的機器學習框架,無論是對於初學者還是開發人員來說都是非常不錯的選擇。如果想要入門機器學習或者在機器學習方面有所深造,那么 TensorFLow 是非常不錯的選擇。