1. 程式人生 > >獨家 | 10分鐘帶你上手TensorFlow實踐(附程式碼)

獨家 | 10分鐘帶你上手TensorFlow實踐(附程式碼)

640?wx_fmt=png&wxfrom=5&wx_lazy=1

原文標題:TensorFlow Tutorial: 10 minutes Practical TensorFlow lesson for quick learners

作者:ANKIT SACHAN

翻譯:和中華

校對:程思衍

本文長度為2000字,建議閱讀10分鐘

通過這篇文章,你可以瞭解TensorFlow中最基礎的幾個概念,還可以學習最簡單的線性迴歸如何在TensorFlow中完成。

這篇TensorFlow教程的目標讀者是那些對機器學習有一定基本概念並且想嘗試上手TensorFlow的人。首先你需要安裝好TensorFlow(可以跟著本教程進行安裝http://cv-tricks.com/artificial-intelligence/deep-learning/deep-learning-frameworks/tensorflow/install-tensorflow-1-0-gpu-ubuntu-14-04-aws-p2-xlarge/

)。 本教程共分為兩部分: 第一部分我們會配合程式碼例項解釋基礎概念, 第二部分我們會構建一個線性迴歸模型。

第一部分: TensorFlow基礎

TensorFlow是一個用於數值計算的庫,其中資料沿著圖(graph)而流動。在TensorFlow中資料用n維陣列表示並被稱之為Tensors。而圖(graph)由資料(也叫Tensors)和數學運算共同組成。

* 圖中的節點: 代表數學運算

* 圖中的邊(edges): 代表在不同運算中流動的Tensors

TensorFlow不同於其他程式語言的另一個方面是: 在TensorFlow中無論你要構建什麼,首先你需要構思整個藍圖。在建立圖的時候,變數並沒有被賦值。隨後當已經建立了完整的圖之後,還需要在一個會話(session)中去執行它,此時圖中的變數才會被賦值。稍後還有更詳細的介紹。

現在讓我們通過動手來學習。執行Python並匯入tensorflow:

0?wx_fmt=png

1. TensorFlow中的圖

圖是TensorFlow的主幹,所有的計算/操作/變數都位於圖中。程式碼中發生的一切都位於TensorFlow提供的一個預設圖中。可以通過如下程式碼訪問該圖:

0?wx_fmt=png

你也可以這樣得到所有操作的list:

0?wx_fmt=png

由於現在圖是空的,所以該語句的輸出也是空的,即[]。

如果想打印出各操作的名稱,用這條語句:

0?wx_fmt=png

這回還是空的,等我們在圖中加入了操作之後再來執行該語句。

另外,我們也可建立多個圖,現在先不細講。

2. TensorFlow會話

圖是用來定義操作的,而操作必須執行在一個會話(session)中,圖和會話的建立是相互獨立的。可以把圖想象成是設計藍圖,則會話就是它的施工地點。

圖僅僅是定義了計算或者說構建了設計藍圖。 然而,除非我們在會話中執行圖或者圖的一部分,否則沒有任何變數也沒有任何值。 

可以這樣建立會話:

0?wx_fmt=png

開啟一個會話時,要記得在結尾處關閉。或者可以用python中的with語句塊,如此一來,它將會自動被關閉: 

0?wx_fmt=png

在本教程的程式碼中我們會頻繁使用with語句塊,我們也推薦你這樣操作。

3. TensorFlow中的Tensors

TF將資料儲存在Tensors中,它有點像numPy包中的多維陣列(儘管它們和numPy陣列不同)

  • 常量

常量的值不能修改,定義方式如下:

0?wx_fmt=png

可以看到,不同於Python之類的其他語言,這裡並不能直接列印/訪問常量的值,除非在會話中執行,再來試一下:

0?wx_fmt=png

這回列印了輸出結果1.0

  • 變數

即Tensors,和其它語言中的變數相似。

0?wx_fmt=png

變數(顧名思義)和常量不同,能夠儲存不同的值。然而,在TF中,變數需要分別進行初始化,單獨初始化每個變數效率很低。但TensorFlow提供了一次性初始化所有變數的機制,具體方法如下:

對於0.11及更早的tf版本,使用initialize_all_variables()方法:

>>>init_op = tf.initialize_all_variables()

0.12及以後的版本,使用global_variables_initializer():

>>>init_op = tf.global_variables_initializer()

上述程式碼會把init_op新增到TensorFlow的預設圖中。

現在,試圖訪問剛才定義的變數b之前,先執行一下init_op,列印b輸出2.0:

0?wx_fmt=png

現在可以打印出該圖中的全部操作:

0?wx_fmt=png

這回輸出了:

Const

test_var/initial_value

test_var

test_var/Assign

test_var/read

init

如你所見,之前定義過常量a, 所以它被加到了圖中。同理,對於變數b而言,許多’test_var’的狀態,例如test_var/initial_value,test_var/read等也被加入了圖中。你可以利用TensorBoard來視覺化整個網路,TensorBoard是一個用於視覺化TensorFlow圖和訓練過程的工具。

  • 佔位符

佔位符,顧名思義表示佔位,是指等待被初始化/填充的tensors。佔位符被用於訓練資料,只有當代碼是在會話中執行的時候佔位符才會被填充。“餵給”佔位符的東西叫做feed_dict。Feed_dict是用於儲存資料的(一系列)鍵值對:

0?wx_fmt=png

上例輸出結果為6.

4. 在TensorFlow中應用裝置 

TensorFlow具有非常強大的內建功能,可以在gpu, cpu或者gpu叢集上執行你的程式碼。 它為你提供了選項,使你能選擇要用來執行程式碼的裝置。 這裡不對此進行詳細介紹,隨後會有單獨關於這個主題的教程。先來看一下TensorFlow全貌:

0?wx_fmt=png

第二部分: 簡單程式碼樣例

這部分我們會學習線性迴歸的程式碼,首先來看幾個程式碼中用到的TensorFlow函式:

建立隨機正態分佈:

使用random_normal建立服從正態分佈的隨機值。本例中,w是一個784*10的變數,其中的值服從標準差為0.01的正態分佈。

0?wx_fmt=png

Reduce_mean:

計算一個數組的均值

0?wx_fmt=png

輸出35

ArgMax:

類似於python中的argmax, 返回沿指定軸方向上,tensor最大值的索引

0?wx_fmt=png

輸出:array([2, 0]), 表示每一行中最大值的索引。

線性迴歸練習:

問題描述:線性迴歸中,開始時有很多資料點,我們的任務是用一條直線來擬合這些點。本例中,我們將生成100個點,並擬合他們。

  • 生成訓練資料

trainX的值位於-1和1之間。

trainY是trainX的3倍外加一些干擾值。

  • 佔位符

定義兩個佔位符,用於隨後填充訓練資料

0?wx_fmt=png

  • 建模

線性迴歸的模型是 y_model = w * x, 我們需要計算出w的值。首先可以初始化w為0來建立一個模型, 並且定義cost函式為(Y – y_model)的平方。TensorFlow中自帶了許多優化器(Optimizer),用來在每次迭代後更新梯度,從而使cost函式最小。這裡我們使用GradientDescentOptimizer以0.01的學習率來訓練模型, 隨後會迴圈執行該訓練操作:

0?wx_fmt=png

  • 訓練

目前為止,我們僅僅是定義好了圖,還沒有任何具體的計算。

TensorFlow的變數還沒有被賦值。為了真正執行定義好的圖,還需要建立並執行一個會話,在此之前,可以先定義初始化所有變數的操作init:

0?wx_fmt=png

第一步,在session.run()中呼叫init完成初始化操作。隨後我們通過向feed_dict“喂”資料來執行train_op。迭代完成之後,我們打印出最終的w值,應該接近3。

  • 練習

如果你又新建了一個會話,會輸出什麼結果呢?

0?wx_fmt=png

將會輸出0.0, 這就是符號計算(symbolic computation)的思想, 一旦脫離了之前的會話,所有的操作都不復存在。

希望這篇教程能幫你在學習TensorFlow之路上開一個好頭, 有任何問題都可以在評論區留言提問,完整的程式碼可以在這裡下載:

https://github.com/sankit1/cv-tricks.com

還可以跟著第二個教程繼續學習TensorFlow:

http://cv-tricks.com/tensorflow-tutorial/training-convolutional-neural-network-for-image-classification/

原文連結:

http://cv-tricks.com/artificial-intelligence/deep-learning/deep-learning-frameworks/tensorflow/tensorflow-tutorial/

0?wx_fmt=jpeg

和中華,留德軟體工程碩士。由於對機器學習感興趣,碩士論文選擇了利用遺傳演算法思想改進傳統kmeans。目前在杭州進行大資料相關實踐。加入資料派THU希望為IT同行們儘自己一份綿薄之力,也希望結交許多志趣相投的小夥伴。

翻譯組招募資訊

工作內容:將選取好的外文前沿文章準確地翻譯成流暢的中文。如果你是資料科學/統計學/計算機專業的留學生,或在海外從事相關工作,或對自己外語水平有信心的朋友,資料派翻譯組歡迎你們加入!

你能得到:提高對於資料科學前沿的認知,提高對外文新聞來源渠道的認知,海外的朋友可以和國內技術應用發展保持聯絡,資料派團隊產學研的背景為志願者帶來好的發展機遇。

其他福利:和來自於名企的資料科學工作者,北大清華以及海外等名校學生共同合作、交流。

點選文末“閱讀原文”加入資料派團隊~

轉載須知

如需轉載,請在開篇顯著位置註明作者和出處(轉自:資料派THUID:DatapiTHU),並在文章結尾放置資料派醒目二維碼。有原創標識文章,請傳送【文章名稱-待授權公眾號名稱及ID】至聯絡郵箱,申請白名單授權並按要求編輯。

釋出後請將連結反饋至聯絡郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。


640?wx_fmt=jpeg

點選“閱讀原文”加入組織~