如何高效的学习TensorFlow代码?
如何高效的學習TensorFlow代碼?
如題,或者如何掌握TensorFlow,應用到任何領域? 添加評論分享10 個回答
愛琳李,老李,明天就輟學了 8?人贊同 本來都忘了這個問題了,不過看到很多人也在關注,也是開森。我補充一個連接: https://www.udacity.com/course/viewer#!/c-ud730/l-6370362152/m-6379811815 這個是Udacity 谷歌給的deep learning 課程,代碼就在tensorflow源碼里面。幾個作業很有趣。課程畫風很可愛,主要是跟著官方Tensorflow的習慣來的,講解理論的時候會比較照顧得到,比如CNN部分的padding什么的命名都是嚴格按照TF方法里的標準。
不過建議大家不要把這門課用來入門上手,理論部分講解的可能不適合入門級。作業代碼可能也需要花點時間去理解。
我也放個blog地址,初學者歡迎大家交流評論:https://ireneli.eu/ 8編輯于 昨天 20:10添加評論感謝 ?作者保留權利 小乖他爹,技術管理/文字/閱讀/戶外/酒 19?人贊同 也在學習中。
個人感覺先把TensorFlow的白皮書:http://download.tensorflow.org/paper/whitepaper2015.pdf
這個論文整明白了,大致模型就明白了。然后學習demo。最后再深入整個代碼。
白皮書有個快翻譯完的中文版:[譯] TensorFlow 白皮書
------------------------------------------------------------------------------------------------------------
最近陸續更新了一些學習筆記,與初學者共享:
SHINING的博客 19編輯于 2016-05-117 條評論感謝 ?作者保留權利 tobe,contributor to the world 2?人贊同 回來補充下,給一個學習線路:
入門最佳拿好不謝 3編輯于 2016-05-15添加評論感謝 ?作者保留權利 morvan,機器學習摸索撞墻多了 9?人贊同 我有在制作專門針對 Tensorflow 的學習視頻,從每一個重要的元素開始講起.一級級上升.
你可以看看我這個播放列表:
莫煩 tensorflow 神經網絡 教程
基本上每一個練習你都能在下面的視頻描述里找到代碼鏈接,方便你自己的學習.
之前在 youtube 上發了以后收到很多贊同,所以就再傳到優酷里了.希望能幫助到大家的學習.
我在 youtube 的頻道: https://www.youtube.com/channel/UCdyjiB5H8Pu7aDTNVXTTpcg
我的頻道里還有一些關于機器學習的視頻教程.
謝謝關注和分享~ 9編輯于 2016-06-257 條評論感謝 ?作者保留權利 思悵,Mechanical Design/Robotics/Computer Vi… 2?人贊同 我最近在使用Tensorflow。為此,我換上了ubuntu,用上了python。總的來說,在了解了神經網絡等基本內容之后,再看官方教程比較容易懂。僅就代碼而言,如果已經熟悉python,那么看不懂的地方查看API即可。我個人覺得開始時最大的難點在于Tensor維度的設計,整個系統的運行機理,以及數據的輸入。先搞懂這幾塊,應該之后學起來快一些。 2發布于 2016-04-038 條評論感謝 ?作者保留權利 喬海軍,互聯網的小蟲子 1?人贊同 可以自己從源碼來部署一遍。
然后就是從簡單的例子開始學習。
我主要再用mxnet,拿這兩者來比較,從比較中可以學到不少東西。
補充一下
tf和mxnet架構極為相似,或者說是英雄所見略同吧 1編輯于 2016-06-102 條評論感謝 ?作者保留權利 Aitian Ma 2?人贊同 可以看這里翻譯的教程哦 Google開源深度學習框架Tensorflow進行mnist數據訓練初學
本文寫給機器學習和tensorflow的初學者。如果你已經知道mnist,softmax(multinomial logistic)regression,你可以會想看這個faster paced tutorial.不過,首先得確認你已經 install TensorFlow .
初學編程,一般都會學習寫一個“hello world!”的程序,MNIST就相當于機器學習領域的“hello world!”
MNIST是一個機器圖像數據集。它包含像下面的一些手寫的數據圖像:
它還包括了每個圖像的數字標簽。例如,上面的圖片的標簽是 5、0、 4 和 1。
在本教程中,我們要訓練一個模型來識別圖像并預測他們是什么數字。我們的目標不是訓練一個真的精準的模型,達到極強的性能 — — 雖然我們以后會給你代碼來做到 !— — 而是要以之為引字讓大家初步了解如何使用TensorFlow。因此,我們要開始與一個非常簡單的模型,稱為 Softmax 回歸。
在本教程中的實際代碼是非常短的和所有有趣的事情發生只需要三行代碼。然而,了解其背后的理念很重要 ︰ TensorFlow 的工作原理和核心機器學習的概念。正因為如此,我們要非常認真地學習這些代碼。
The MNIST DataMNIST 數據Yann LeCun's website網站上。為了方便,我們已經包括一些 python 代碼來自動下載并安裝數據。你可以要么下載的代碼和將其導入如下,或簡單地復制并粘貼它。
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) 下載數據分割成三個部分,55,000 的數據點的訓練數據 (mnist.train)、 10000 個點的測試數據 (mnist.test) 和 5000 點的驗證數據 (mnist.validation)。這種分割是非常重要 ︰ 機器學習中測試數據非常重要,通過它我們才可以驗證學到的知識是可以泛化的 !正如前面提到的每個 MNIST 數據點有兩個部分 ︰ 圖像的手寫的數字和相應的標簽。我們將調用圖像"xs"和標簽"ys"。訓練集和測試集包含 x 和 y 們,例如訓練圖像是 mnist.train.images 訓練的標簽是 mnist.train.labels。
每個圖像是 28 x 28 像素。我們可以把這解讀為一大系列的數字 ︰
我們可以把這些數據變成一個 28 × 28 = 784 矢量數組。我們如何拼合數組并不重要,只要所有的圖像都一致。從這個角度來看,MNIST 圖像都只是一堆784三維向量空間,有很豐富結構 (警告 ︰ 計算密集型的可視化效果)。
扁平數據扔掉圖像的二維結構有關的信息。不會很糟糕嗎?嗯,最好的計算機視覺方法會利用這種結構,我們將在以后的教程中提到。我們在這里用到的簡單方法,使用 softmax 回歸,則不會關注這些結構。
其結果是,mnist.train.images 是一個形狀 [55000,784]的張量(n 維數組)。第一維是圖像和第二個維度是每個圖像的像素。在張量的每個條目是 0 和 1 之間,為某個特定的圖像中像素點的像素強度。
MNIST 中的相應標簽是數字 0 至 9,描述給定的圖像是哪個數字。出于本教程的目的,我們要想我們作為一個"one-hot"的標簽。one-hot矢量是一個由多個0和一個1組成的向量。在這種情況下,第 n 個數字將被表示為一個向量中第 n 個元素為1。例如,3 將是[0,0,0,1,0,0,0,0,0,0]。這樣,mnist.train.labels 是 [55000,10]陣列的浮點數。
現在我們就可以真正開始建立我們的模型了!
Softmax Regressions我們知道,在 MNIST 中的每個圖像是一個數字,無論是零或九。我們想要能夠通過一張圖片,給它是每個數字的概率。例如,我們的模型可能看到了九的圖片并給出 80%的概率它是一個九,但給出它可以是5%是八的可能性 (因為頂層循環) 和極小的概率它可能是所有其他數字。
這是一個經典的案例,其中 softmax 回歸是一個自然、 簡單的模型。如果你想要將概率分配給一個或者幾個不同的可能時,softmax 就可以完成這樣的事情。甚至后來,當我們訓練更復雜的模型,最后一步也將是softmax一層。
Softmax 回歸有兩個步驟 ︰ 首先我們要把這些輸入的特征加起來,然后我們將這些特征轉換成概率。
為了總結了給定的圖像的特征,我們把這些像素強度做加權求和。權重的大小表明該特征在確定它為正確分類時候的作用大小。
下面的關系圖顯示了學到的每個類的權重一個模型。紅色代表負的權重,而藍色表示正的權重。
We also add some extra evidence called a bias. Basically, we want to be able to say that some things are more likely independent of the input. The result is that the evidence for a class i given an input x is:
我們還添加了一些額外的證據,被稱為一種偏見。基本上,就指獨立于輸入的特征。結果是對于i這一類據,我給出了輸入 x,結果就是︰
evidencei=∑jWi, jxj+bi
其中Wi是權重,bi是類i的偏見,,j是輸入x像素。我們可以通過softmax函數把這些變成預測的概率如下:
y=softmax(evidence)
這里 softmax 擔任"激活"或"鏈接"的功能,把我們的線性函數輸出變成我們想要的結果 — — 在這種情況下,概率分布為 10 例。你可以認為它是把輸入的證據轉換成可能是某一類的可能性。它被定義為 ︰
softmax(x)=normalize(exp?(x))
展開方程你會得到如下的公式:
softmax(x)i=exp?(xi)/∑jexp?(xj)
通常以第一種方式看 softmax︰指數化輸入,然后正則化輸出。指數化意味著更多的輸入特征會指數級增加其權重。相反,較少單元特征會讓假設中獲得其權重的一小部分。假設分類不會有0或者負的權重。Softmax然后正則化這些權重,以便他們相加為一,形成一個有效的概率分布。(若要了解更多關于softmax 函數的內容,參見 section 它邁克爾 · 尼爾森書,完整的交互式可視化中一節)。
你能想象 softmax 回歸作為類似下面的內容,雖然現實中會有更多的 xs。對于每個輸出,我們計算 xs 的加權的和,添加一個bias,然后應用 softmax。
如果把它寫成方程,就可以得到 :
然后我們可以把這個過程“標量化”,變成矩陣相乘和向量相加。這會讓計算更加快速。(也是一種簡化思考的方法)
更加簡化一下,我們可以把它寫成:
y=softmax(Wx+b)
進行回歸
要在Python中做到快速數值計算,我們通常使用像 NumPy 做矩陣乘法,然后使用python之外的另一種語言實現的高效代碼的庫。不幸的是和Pyhton操作的切換間仍有很大的開銷。這種開銷是尤其糟糕,如果你想要在 Gpu 上或以分布式的方式運行。這種方法下數據傳輸的成本會比較高。
TensorFlow 也是在 python之外做這些繁重的計算,但它更進一步,從而避免這種開銷。不是用python以外的語言獨立運行單個昂貴的操作,TensorFlow讓我們通過圖描述的方式完全從外部運行python的交互操作。(可以在幾個機器學習庫中看到像這樣的方法)。
若要使用 TensorFlow,我們需要將其導入。
import tensorflow as tf
這些交互式的操作需要符號變量。我們先來創建一個:
x = tf.placeholder(tf.float32, [None, 784])x并不是一個特定的值,它是一個placeholder,一個我們需要輸入數值當我們需要tensorflow進行運算時。我們想要輸入任意數量的mnist圖片,每一個都展開成一個784維的向量。我們用一個二維的[None, 784]浮點張量代表。 (這里的None表示維度可以是任意的長度.)
我們的模型中也需要權重和bias。我們可以把它們看成是額外的輸入,Tensorflow有更加好的方法來表示它: Variable. Variable是一個Tensorflow圖交互操作中一個可以修改的張量。 它可以在計算中修改。對于機器學習的,一般都有一些Variable模型參數。
W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) 我們通過給 tf.Variable 來創建這些變量。下面這種情況,我們將初始化 W 和 b 為全零的張量。因為我們將要學習 W 和 b,所以他們初始值是什么都沒關系。注意,W 的形狀 [784,10] ,是因為我們想要 784 三維圖像向量乘以它輸出10 維向量以標識的不同類。b形狀是 [10],這樣我們可以將其和輸出相加。
現在,我們可以實現我們的模型。它只需要一行代碼 !
y = tf.nn.softmax(tf.matmul(x, W) + b) 首先,我們通過tf.matmul (x,W)來把x和W相乘。這和我們的方程中看到的順序是相反的,在那里面是Wx。然后加上b,最后應用 tf.nn.softmax。就是這樣。我們只花了一行代碼來定義我們的模型。不是因為 TensorFlow 旨在簡化 softmax 回歸︰ 它只是想通過非常靈活的方式來描述很多各種各樣的數值計算,從機器學習模型到物理模擬。定義后,可以在不同的設備上運行我們的模型︰您的計算機的CPU、Gpu、甚至手機 !
訓練
為了訓練我們的模型,我們需要定義怎么樣的模型才是好的。嗯,實際上,在機器學習中我們通常會為模型定義怎么樣是壞的稱為成本或損失,然后再試,盡量最小化這個成本或者損失。但兩者是等同的。
一個很常見的很好的成本函數是"cross-entropy交叉熵"。出人意料的是,交叉熵雖然產生于對信息壓縮碼信息理論的思考,但它最終被在很多方面,從賭博到機器學習。它的定義是︰
Hy′(y)=?∑iyi′log?(yi)
這里y是我們預測的概率分布,而y′ 是真正的分布(那個我們要輸入的one-hot標題).某種理解下,交叉熵可以衡量我們的預測是多少的低效。本文不會更加詳細地深入交叉熵,但它很值得去理解-> understanding.
為了使用交叉熵,我們要先增加一個新的placeholder來放正確的結果:
y_ = tf.placeholder(tf.float32, [None, 10])然后設置交叉熵, ?∑y′log?(y):
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) 首先,tf.log 計算 y 的每個元素的對數。接下來,我們把y_乘以tf.log(y) 的相應元素的每個元素。然后 tf.reduce_sum y。最后,tf.reduce_mean 在批處理中計算所有示例平均值。現在,我們知道我們想要我們的模型做什么,它是很容易通過 TensorFlow 去訓練它。因為TensorFlow 了解整個圖的計算,它可以自動使用反向傳播算法有效地確定你的變量是如何影響成本函數并把它最小化。然后,它可以應用您所選擇的優化算法來修改變量和降低成本函數。
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) 本例子中,我們通過TensorFlow使用學習率為 0.5的梯度下降算法盡量減少 cross_entropy 。梯度下降是一個簡單的程序,其中TensorFlow 會調整每個變量點從而使之向降低成本的方向運動。但 TensorFlow 還提供了許多其它優化算法︰使用它簡單到只需要一行代碼。
TensorFlow 實際上做什么在這里,在幕后,是它向你執行反向傳播和梯度下降的圖表添加新操作。然后它給你回到單個操作,當運行時,會做一步的梯度下降法訓練,微調一下您的變量,以降低成本。
現在,我們設置好了我們的模型。最后一件事在我們啟動它之前,我們要添加一個操作來初始化我們創建的變量︰
init = tf.initialize_all_variables()現在我們可以啟動一個會話,然后運行初始化變量的操作:
sess = tf.Session() sess.run(init)訓練走起來-- 我們要進行1000次這樣的訓練!
for i in range(1000):batch_xs, batch_ys = mnist.train.next_batch(100)sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})Each step of the loop, we get a "batch" of one hundred random data points from our training set. We runtrain_step feeding in the batches data to replace the placeholders.
Using small batches of random data is called stochastic training -- in this case, stochastic gradient descent. Ideally, we'd like to use all our data for every step of training because that would give us a better sense of what we should be doing, but that's expensive. So, instead, we use a different subset every time. Doing this is cheap and has much of the same benefit.
在循環的每一步,我們從我們的訓練集得到一百隨機數據點"批處理"。我們運行 train_step 批次的數據來替換占位符。
使用隨機數據進行小批量稱為隨機訓練 — — 在這種情況下,隨機的梯度下降法。理想情況下,我們想使用我們所有的數據訓練的每一步,因為這會給我們感覺是更好的方法,但這樣代價太大。相反,每次我們使用一個不同的子集,這樣做代價更小而且可以達到相同的效果。
模型評價How well does our model do?
Well, first let's figure out where we predicted the correct label. tf.argmax is an extremely useful function which gives you the index of the highest entry in a tensor along some axis. For example, tf.argmax(y,1) is the label our model thinks is most likely for each input, while tf.argmax(y_,1) is the correct label. We can use tf.equalto check if our prediction matches the truth.
我們的模型表現如何呢?
好吧,先讓我們弄清楚我們預測正確的標簽在哪里。tf.argmax 是項的極其有益的函數,它給返回在一個標題里最大值的索引。例如,tf.argmax(y,1) 是我們的模型輸出的認為是最有可能是的那個值,而 tf.argmax(y_,1) 是正確的標簽的標簽。如果我們的預測與匹配真正的值,我們可以使用 tf.equal來檢查。
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))這會返回我們一個布爾值的列表.為了確定哪些部分是正確的,我們要把它轉換成浮點值,然后再示均值。 比如, [True, False, True, True] 會轉換成 [1,0,1,1] ,從而它的準確率就是0.75.
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))最后我們在測試數據上求準確率的值:
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))應該會是大約 92%.
這樣的結果是不是已經很好了呢?好吧,并不是真的。事實上,它糟糕透了。這是因為我們使用的一個非常簡單的模型。一些小的變化,我們實事上可以達到 97%的準確率。最好的模型可以到達 99.7%以上精度 !(有關詳細信息,看一看這結果列表-> list of results)。
然而重要的是我們學會了使用這個模型。不過,如果你對于這個結果還是不太滿意,查閱the next tutorial我們通過一個教程和學習如何通過TensorFlow構建更復雜的模型,它會達到更高的精度哦!
歡迎訪問網站:奇趣兒 – 到天邊外去…
歡迎關注微信號:奇趣兒beta
歡迎掃描二維碼:
2發布于 2016-06-02添加評論感謝 ?作者保留權利 莫宇塵,maya再也不敢亂立flag了 2?人贊同 oop讀代碼作業要到ddl了,馬克下等菊苣們|・ω・`) 2發布于 2016-04-25添加評論感謝 ?作者保留權利 知乎用戶,水可載舟,亦可賽艇。 1?人贊同 Tensorflow的確設計的不錯,我的學習進度是先看demo對照demo查看文檔。其實它和theano有需要相似之處,比如圖計算模型,惰性計算,不過個人覺得要理解tensorfolw張量的模型特別重要,tensorflow seving構建需要谷歌的依賴,有大坑。總結
以上是生活随笔為你收集整理的如何高效的学习TensorFlow代码?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB的设计模式策略
- 下一篇: 资源推荐 | TensorFlow电子书