天天看點

機器學習的敲門磚:手把手教你TensorFlow初級入門文章原标題《Getting to Know TensorFlow》,作者:Nishant Shukla

<b>以下為譯文:</b>

在開始使用機器學習算法之前,我們應該首先熟悉如何使用它們。 而本文就是通過對tensorflow的一些基本特點的介紹,讓你了解它是機器學習類庫中的一個不錯的選擇。

讓我們設想一下,當我們用python寫代碼時,沒有那些友善的類庫會是怎樣一種窘境。 這就好比你有一個新的智能手機,而不安裝任何應用程式。 雖然它仍然可以打電話,發短信,但如果有了那些更友善的應用程式,這部智能手機才更有價值。

設想一下這個場景...你作為一名業務負責人,需要負責跟蹤銷售流程。 你希望計算銷售産品的收入。 現在有100個不同的産品在你的倉庫中,你需要用一個向量表示每個産品的價格。 另一個大小為100的向量表示每個産品的庫存量。 以下的python代碼是用來計算銷售所有産品的收入。注意了, 這裡沒有調用任何類庫。

代碼清單1. 不使用任何python類庫計算兩個向量的内積

這段代碼隻是計算兩個向量(也稱為點積)的内積。 想象一下,對于更複雜的問題,需要多少代碼。例如求解線性方程或計算兩個向量之間的距離。

當你安裝tensorflow類庫的同時,其中還包括了非常知名的numpy類庫,對python程式設計中的數學操作非常有用。用python程式設計時,不使用類庫(例如numpy和tensorflow)就像使用沒有自動對焦的相機:你雖然獲得了更多的靈活性,但你可能很容易犯錯。在機器學習的過程中已經很容易犯錯誤了,是以就讓我們使用tensorflow來提高化軟體開發的效率吧。

代碼清單2展示了如何使用numpy簡潔地編寫相同的内積運算。

<b>代碼清單2. 用numpy類庫計算内積</b>

python是一種簡潔的語言,這意味着你不會看到冗長的代碼。另一方面,python語言的簡潔意味着許多處理都在背景進行,是以我們應該熟悉它背後的原理。

機器學習主要依賴于很多數學公式,本文将對使用tensorflow進行這類數學運算做一個初步的介紹。通過示例和代碼,大家可以對tensorflow有一個初步了解。例如如何運用tensorflow計算大資料的統計資訊。 是以本文的重點将完全是關于如何使用tensorflow,而不是一般的機器學習算法運用。

機器學習算法需要大量的數學運算。 通常,某個算法可以歸結為簡單函數組合的疊代,直到它收斂為止。 當然,也可以使用任何标準程式設計語言來執行這些計算。但是使用像tensorflow這樣已經非常完善了的類庫是提高代碼可控性和性能的關鍵。

<b>確定</b><b>tensorflow</b><b>工作</b>

首先,為我們的第一段代碼建立一個名為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庫通常使用tf限定名稱來進行導入。

一般來說,使用tf限定名稱是一個不錯的方法,以便與其他開發人員和開源tensorflow項目保持一緻。 你也可以選擇不使用這個限定名稱,但這會影響你在自己的項目中重用别人的tensorflow代碼。

在現實世界中描述對象的一個簡便方法就是通過羅列出它的屬性或特征。 例如,我們可以通過顔色,型号,發動機類型和裡程數描述一輛汽車。

這些特征的有序清單被稱為特征向量,這正是我們要在tensorflow代碼中所表示的。

特征向量是機器學習中最有用的方法之一,(它們就是一個數字清單)。每個資料項通常有一個特征向量,而一個好的資料集則具有數千個特征向量。 毫無疑問,你會經常一次處理多個向量。 矩陣簡明地表示了向量清單,其中矩陣的每清單示一個特征向量。

在tensorflow中用向量的向量表示矩陣,每個向量具有相同的長度。 圖1是一個兩行三列的矩陣的示例,例如[[1,2,3],[4,5,6]]。 注意,這是一個包含兩個元素的向量,每個元素對應一個矩陣行。

機器學習的敲門磚:手把手教你TensorFlow初級入門文章原标題《Getting to Know TensorFlow》,作者:Nishant Shukla

<b>圖1.圖上半部分是計算機對矩陣的表示,下半部分是我們日常生活中對矩陣的表示。 這種形式的符号是大多數科學計算類庫中的常見範例。</b>

我們通過指定其行和列索引來定位矩陣中的元素。 例如,第一行和第一列來表示左上角第一個元素。 有時,我們需要使用兩個以上的索引,這樣來表示一個元素會很友善。例如,在表示一個圖檔中的像素時,我們不僅通過其行和列值來描述它,而且還使用紅,綠,藍通道來對其進行描述。 張量是通過任意數量的索引指定矩陣中元素的一般化。

一個張量的例子...假設一所國小為每個學生配置設定座位。

而你是這個學校的校長,并且你記不住這些學生的名字。

幸運的是,每個教室都有一個座位網格,可以通過學生的行和列來指定某個學生。

因為有多個教室,是以你不能簡單的說“早上好,4排10列!”你還需要指定教室,比如說“你好, 教室2的4排10列”。不像矩陣隻需要兩個索引就能指定一個元素,這所學校的學生需要三個數字。

這三個數字都是三階張量的一部分!

張量是更多的嵌套向量。例如,一個2×3×2的張量為[[[1,2],[3,4],[5,6]],[[7,8],[9,10] 11,12]]],它可以被認為是兩個矩陣,每個大小為3×2。 是以,我們說這個張量的秩是3.一般來說,張量的秩是指定一個元素所需的索引的數量。 tensorflow中的機器學習算法是作用于張量上的,了解如何使用它們是關鍵。

機器學習的敲門磚:手把手教你TensorFlow初級入門文章原标題《Getting to Know TensorFlow》,作者:Nishant Shukla

<b>圖2.該張量可以被認為是堆疊在彼此之上的多個矩陣。 要指定其中的某個元素,必須指明行和列,以及要通路的矩陣。 是以,該張量的秩為三。</b>

你可能會對如何表示張量産生疑惑。下面三行代碼試圖表示相同的2×2矩陣。 該矩陣表示兩個次元的兩個特征向量。 例如,它可以表示兩個人對兩部電影的評價。 每個人,由矩陣的行索引表示,配置設定一個數字來描述每個人的電影評價值,由列索引表示。 運作代碼以了解如何在tensorflow中生成矩陣。

<b>代碼清單3.表示張量的不同方式</b>

第一個變量m1是一個清單,第二個變量m2是numpy類庫中的一個ndarray,最後一個變量m3是tensorflow的tensor對象。tensorflow中所有運算符(如neg)都設計為對張量對象進行操作。tf.convert_to_tensor(...)這個方法,我們可以用在任何地方,以確定我們處理張量而不是其他類型。tensorflow類庫中的大多數方法都已經調用了它。使用tf.convert_to_tensor(...)并不是必須的,在這裡使用它,是因為它有助于我們了解隐式類型的跨類庫處理。

讓我們再來看看如何中定義張量。 導入tensorflow類庫之後,我們可以使用常量運算符,如代碼清單4所示。

代碼清單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。

<b>建立運算符</b>

我們已經有了幾個初始的張量,現在我們可以用運算符對他們進行操作,比如加減乘除。 假設現在有一個矩陣,它的行表示貨币交易,收款金額(正值)和收款金額(負值)。 矩陣取反是表示某個人的貨币流曆史記錄的一種方式。 我們現在對代碼清單4中的matrix1進行取反操作neg(negation的縮寫)。矩陣取反将正數轉換為絕對值相同的負數,反之亦然。

取反操作是最簡單的操作之一。

如代碼清單5所示,取反隻需将一個張量作為輸入,得出另一個張量,每個元素取反。現在,嘗試自己運作代碼。

如果你已經掌握了如何使用取反,那就可以推廣到所有其他tensorflow的操作。

這裡需要指出,定義操作(如取反操作)和運作它是不一樣的。

<b>代碼清單5.</b>

取反運算符的使用

代碼清單5的輸出:

更多tensorflow的運算符

<b></b>

官方文檔詳細地列出了所有可用的數學操作:

https://www.tensorflow.org/api_docs/python/math_ops.html。

常用操作符的示例包括:

我們可以這些tensorflow運算符來産生高斯分布(也稱為正态分布)。 參見圖3提示。 你可以參考wiki,找到正态分布的機率密度:https://en.wikipedia.org/wiki/normal_distribution。

為了簡潔起見,諸如“*”,“ - ”,“+”等大多數數學表達式是其tensorflow運算符的快捷方式。 高斯函數包括許多運算,如下所示:

機器學習的敲門磚:手把手教你TensorFlow初級入門文章原标題《Getting to Know TensorFlow》,作者:Nishant Shukla

圖3.該圖表示産生高斯分布所需的操作。 節點之間的連結表示資料如何從一個操作進入下一個操作。 操作本身很簡單,但是它們如何互相作用是相對複雜的。

tensorflow算法很容易可視化。 它們可以用流程圖來進行描述。 流程圖就是一種圖表。 流程圖中的每個箭頭都稱為圖形的邊。 而它的每個狀态被稱為節點。

<b>在會話中執行運算符</b>

會話(session)是描述代碼應該如何運作的軟體系統環境。在tensorflow中,會話設定了硬體裝置(如cpu和gpu)如何互相通信。這樣,你隻要關心如何設計機器學習算法,而不必擔心底層硬體裝置的運作。當然,你也可以配置會話以更改其底層硬體裝置互動行為,而不更改上層代碼。

要在tensorflow中運作程式計算數值是需要一個會話的。 隻有在已建立的會話才可以對tensor對象進行指派。 為此,我們必須使用tf.session()建立一個會話類,并由它來運作一個運算符(代碼清單6)。

<b>代碼清單6.使用會話</b>

恭喜! 你剛剛寫了第一個完整的tensorflow代碼。 盡管它所做的是隻是對一個矩陣進行取反,但它已經能充分展現tensorflow中的核心概念與架構了。

在建立tf.session類時,我們可以向構造函數傳遞一些參數。 例如,tensorflow會根據可用的内容自動确定為指定gpu或cpu裝置的最佳方式。 在建立會話時,我們可以設定log_device_placements

= true,如代碼清單7所示。

<b>代碼清單7 登入一個會話</b>

這将輸出有關每個操作的會話中使用哪些cpu / gpu裝置的資訊。 例如,執行代碼清單6中的程式會有以下輸出,它顯示了用于運作取反操作的裝置:

會話在tensorflow中是必不可少的。 我們需要調用一個會話來執行數學操作。 圖4描述了tensorflow上的不同元件如何與機器學習管道的互動。 會話不僅執行圖像操作,而且還可以使用占位符,變量和常量作為輸入。 到目前為止,我們已經使用了常量,但在後面的部分,我們将開始使用變量和占位符。 以下是這三種類型值的簡要概述。

<b>•</b><b>占位符</b>:未配置設定的值,但将由運作的會話初始化。

<b>•</b><b>變量</b>:可以更改的值,例如機器學習模型的參數。

<b>•</b><b>常數</b>:不更改的值,例如超參數或設定。

機器學習的敲門磚:手把手教你TensorFlow初級入門文章原标題《Getting to Know TensorFlow》,作者:Nishant Shukla

<b>圖4.會話訓示如何使用硬體來最有效地處理圖形。 當會話開始時,它将cpu和gpu裝置配置設定給每個節點。</b>

在處理之後,會話用可用格式(例如numpy數組)輸出資料。

會話可以接受占位符,變量和常量。

我希望你通過本文已經熟悉了一些tensorflow程式設計的基本方法。 如果這篇文章讓你對tensorflow 産生了興趣,請下載下傳machine learning with tensorflow的第一章,從中了解更多内容。

<a href="https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?usercode=lwju78qa&amp;utm_source=lwju78qa">數十款阿裡雲産品限時折扣中,趕緊點選領劵開始雲上實踐吧!</a>