摘要:在開始使用機器學習算法以前,咱們應該首先熟悉如何使用它們。 而本文就是經過對TensorFlow的一些基本特色的介紹,讓你瞭解它是機器學習類庫中的一個不錯的選擇。
html
在開始使用機器學習算法以前,咱們應該首先熟悉如何使用它們。而本文就是經過對TensorFlow的一些基本特色的介紹,讓你瞭解它是機器學習類庫中的一個不錯的選擇。
linux
讓咱們設想一下,當咱們用Python寫代碼時,沒有那些方便的類庫會是怎樣一種窘境。這就比如你有一個新的智能手機,而不安裝任何應用程序。雖然它仍然能夠打電話,發短信,但若是有了那些更方便的應用程序,這部智能手機才更有價值。算法
設想一下這個場景...你做爲一名業務負責人,須要負責跟蹤銷售流程。你但願計算銷售產品的收入。如今有100個不一樣的產品在你的倉庫中,你須要用一個向量表示每一個產品的價格。另外一個大小爲100的向量表示每一個產品的庫存量。如下的Python代碼是用來計算銷售全部產品的收入。注意了,這裏沒有調用任何類庫。編程
這段代碼只是計算兩個向量(也稱爲點積)的內積。想象一下,對於更復雜的問題,須要多少代碼。例如求解線性方程或計算兩個向量之間的距離。
api
當你安裝TensorFlow類庫的同時,其中還包括了很是知名的NumPy類庫,對Python編程中的數學操做很是有用。用Python編程時,不使用類庫(例如NumPy和TensorFlow)就像使用沒有自動對焦的相機:你雖然得到了更多的靈活性,但你可能很容易犯錯。在機器學習的過程當中已經很容易犯錯誤了,因此就讓咱們使用TensorFlow來提升化軟件開發的效率吧。數組
代碼列表2展現瞭如何使用NumPy簡潔地編寫相同的內積運算。session
Python是一種簡潔的語言,這意味着你不會看到冗長的代碼。另外一方面,Python語言的簡潔意味着許多處理都在後臺進行,所以咱們應該熟悉它背後的原理。
框架
關於TensorFlow的Python和C ++ API的各類函數的詳細文檔,請參見www.tensorflow.org/api_docs/in…。機器學習
機器學習主要依賴於不少數學公式,本文將對使用TensorFlow進行這類數學運算作一個初步的介紹。經過示例和代碼,你們能夠對TensorFlow有一個初步瞭解。例如如何運用TensorFlow計算大數據的統計信息。所以本文的重點將徹底是關於如何使用TensorFlow,而不是通常的機器學習算法運用。編程語言
機器學習算法須要大量的數學運算。一般,某個算法能夠歸結爲簡單函數組合的迭代,直到它收斂爲止。固然,也可使用任何標準編程語言來執行這些計算。可是使用像TensorFlow這樣已經很是完善了的類庫是提升代碼可控性和性能的關鍵。
首先,爲咱們的第一段代碼建立一個名爲test.py的新文件。經過運行如下代碼導入TensorFlow:
在導入TensorFlow後,若是Python解釋器沒有報錯,那麼咱們就能夠開始使用TensorFlow了。
遇到了錯誤?在這裏,常見錯誤的緣由是你可能安裝了GPU版本,而且類庫沒法搜索CUDA驅動程序。請記住,若是使用CUDA編譯庫,則須要使用CUDA的路徑更新環境變量。你須要檢查TensorFlow上的CUDA指令。(有關詳情,請參閱https://www.tensorflow.org/versions/master/get_started/os_setup.html#optional-linux-enable-gpu-support)。
使用TensorFlow中的規則
TensorFlow庫一般使用tf限定名稱來進行導入。通常來講,使用tf限定名稱是一個不錯的方法,以便與其餘開發人員和開源TensorFlow項目保持一致。你也能夠選擇不使用這個限定名稱,但這會影響你在本身的項目中重用別人的TensorFlow代碼。
表示張量
在現實世界中描述對象的一個簡便方法就是經過羅列出它的屬性或特徵。 例如,咱們能夠經過顏色,型號,發動機類型和里程數描述一輛汽車。 這些特徵的有序列表被稱爲特徵向量,這正是咱們要在TensorFlow代碼中所表示的。
特徵向量是機器學習中最有用的方法之一,(它們就是一個數字列表)。每一個數據項一般有一個特徵向量,而一個好的數據集則具備數千個特徵向量。毫無疑問,你會常常一次處理多個向量。矩陣簡明地表示了向量列表,其中矩陣的每列表示一個特徵向量。
在TensorFlow中用向量的向量表示矩陣,每一個向量具備相同的長度。圖1是一個兩行三列的矩陣的示例,例如[[1,2,3],[4,5,6]]。注意,這是一個包含兩個元素的向量,每一個元素對應一個矩陣行。
咱們經過指定其行和列索引來定位矩陣中的元素。例如,第一行和第一列來表示左上角第一個元素。有時,咱們須要使用兩個以上的索引,這樣來表示一個元素會很方便。例如,在表示一個圖片中的像素時,咱們不只經過其行和列值來描述它,並且還使用紅,綠,藍通道來對其進行描述。張量是經過任意數量的索引指定矩陣中元素的通常化。
一個張量的例子...假設一所小學爲每一個學生分配座位。而你是這個學校的校長,而且你記不住這些學生的名字。幸運的是,每一個教室都有一個座位網格,能夠經過學生的行和列來指定某個學生。
由於有多個教室,因此你不能簡單的說「早上好,4排10列!」你還須要指定教室,好比說「你好,教室2的4排10列」。不像矩陣只須要兩個索引就能指定一個元素,這所學校的學生須要三個數字。這三個數字都是三階張量的一部分!
張量是更多的嵌套向量。例如,一個2×3×2的張量爲[[[1,2],[3,4],[5,6]],[[7,8],[9,10] 11,12]]],它能夠被認爲是兩個矩陣,每一個大小爲3×2。所以,咱們說這個張量的秩是3.通常來講,張量的秩是指定一個元素所需的索引的數量。TensorFlow中的機器學習算法是做用於張量上的,理解如何使用它們是關鍵。
你可能會對如何表示張量產生疑惑。下面三行代碼試圖表示相同的2×2矩陣。該矩陣表示兩個維度的兩個特徵向量。例如,它能夠表示兩我的對兩部電影的評價。每一個人,由矩陣的行索引表示,分配一個數字來描述每一個人的電影評價值,由列索引表示。運行代碼以瞭解如何在TensorFlow中生成矩陣。
第一個變量m1是一個列表,第二個變量m2是NumPy類庫中的一個ndarray,最後一個變量m3是TensorFlow的Tensor對象。TensorFlow中全部運算符(如neg)都設計爲對張量對象進行操做。tf.convert_to_tensor(...)這個方法,咱們能夠用在任何地方,以確保咱們處理張量而不是其餘類型。TensorFlow類庫中的大多數方法都已經調用了它。使用tf.convert_to_tensor(...)並非必須的,在這裏使用它,是由於它有助於咱們理解隱式類型的跨類庫處理。
讓咱們再來看看如何中定義張量。導入TensorFlow類庫以後,咱們可使用常量運算符,如代碼列表4所示。
代碼4的運行結果:
從運行結果中能夠看出,每一個張量都由已命名的Tensor對象表示。每一個Tensor對象都有一個惟一的標籤(名稱),一個用於定義其結構的維度(shape),以及用於指定咱們要操做的數據類型(dtype)。由於咱們並無顯示指定名稱,因此他們被自動命名爲:「Const:0」,「Const_1:0」和「Const_2:0」。
張量類型
須要注意的是matrix1的每一個元素以小數點結束,這是爲了告訴Python該元素的數據類型不是整數,而是浮點數。咱們能夠傳遞顯式dtype值。和NumPy數組同樣,張量能夠接受咱們指定的類型。
TensorFlow也提供了一些構造函數用於一些簡單的張量。例如,tf.zeros(shape)建立了一個包涵全部值都被初始化爲零的特定形態的張量。 相似地,tf.ones(shape)建立了一個全部元素值爲1的張量。 shape參數是描述張量的維度的一維張量,它的類型是int32。
建立運算符
咱們已經有了幾個初始的張量,如今咱們能夠用運算符對他們進行操做,好比加減乘除。假設如今有一個矩陣,它的行表示貨幣交易,收款金額(正值)和收款金額(負值)。矩陣取反是表示某我的的貨幣流歷史記錄的一種方式。咱們如今對代碼列表4中的matrix1進行取反操做neg(negation的縮寫)。矩陣取反將正數轉換爲絕對值相同的負數,反之亦然。
取反操做是最簡單的操做之一。如代碼列表5所示,取反只需將一個張量做爲輸入,得出另外一個張量,每一個元素取反。如今,嘗試本身運行代碼。若是你已經掌握瞭如何使用取反,那就能夠推廣到全部其餘TensorFlow的操做。
這裏須要指出,定義操做(如取反操做)和運行它是不同的。
代碼列表5的輸出:
更多TensorFlow的運算符
官方文檔詳細地列出了全部可用的數學操做:
https://www.tensorflow.org/api_docs/Python/math_ops.html。
經常使用操做符的示例包括:
咱們能夠這些TensorFlow運算符來產生高斯分佈(也稱爲正態分佈)。 參見圖3提示。 你能夠參考wiki,找到正態分佈的機率密度:https://en.wikipedia.org/wiki/Normal_distribution。
爲了簡潔起見,諸如「*」,「-」,「+」等大多數數學表達式是其TensorFlow運算符的快捷方式。高斯函數包括許多運算,以下所示:
TensorFlow算法很容易可視化。它們能夠用流程圖來進行描述。流程圖就是一種圖表。流程圖中的每一個箭頭都稱爲圖形的邊。而它的每一個狀態被稱爲節點。
在會話中執行運算符
會話(session)是描述代碼應該如何運行的軟件系統環境。在TensorFlow中,會話設置了硬件設備(如CPU和GPU)如何相互通訊。這樣,你只要關心如何設計機器學習算法,而沒必要擔憂底層硬件設備的運行。固然,你也能夠配置會話以更改其底層硬件設備交互行爲,而不更改上層代碼。
要在TensorFlow中運行程序計算數值是須要一個會話的。只有在已建立的會話才能夠對Tensor對象進行賦值。爲此,咱們必須使用tf.Session()建立一個會話類,並由它來運行一個運算符(代碼列表6)。
恭喜!你剛剛寫了第一個完整的TensorFlow代碼。儘管它所作的是隻是對一個矩陣進行取反,但它已經能充分體現TensorFlow中的核心概念與框架了。
會話配置
在建立tf.Session類時,咱們能夠向構造函數傳遞一些參數。 例如,TensorFlow會根據可用的內容自動肯定爲指定GPU或CPU設備的最佳方式。 在建立會話時,咱們能夠設置log_device_placements = True,如代碼列表7所示。
這將輸出有關每一個操做的會話中使用哪些CPU / GPU設備的信息。例如,執行代碼列表6中的程序會有如下輸出,它顯示了用於運行取反操做的設備:
會話在TensorFlow中是必不可少的。咱們須要調用一個會話來執行數學操做。圖4描述了TensorFlow上的不一樣組件如何與機器學習管道的交互。會話不只執行圖像操做,並且還可使用佔位符,變量和常量做爲輸入。到目前爲止,咱們已經使用了常量,但在後面的部分,咱們將開始使用變量和佔位符。如下是這三種類型值的簡要概述。
•佔位符:未分配的值,但將由運行的會話初始化。
•變量:能夠更改的值,例如機器學習模型的參數。
•常數:不更改的值,例如超參數或設置。
想了解更多?
我但願你經過本文已經熟悉了一些TensorFlow編程的基本方法。若是這篇文章讓你對TensorFlow產生了興趣,請下載Machine Learning with TensorFlow的第一章,從中瞭解更多內容。
文章原標題《Getting to Know TensorFlow》,做者:Nishant Shukla
文章爲簡譯,更爲詳細的內容,請查看原文
本文由阿里云云棲社區組織翻譯。