轉自:https://www.zhihu.com/question/41667903?sort=created
24 個回答
Google發佈了Tensorflow遊樂場。Tensorflow是Google今年推出的機器學習開源平臺。而有了Tensorflow遊樂場,我們在瀏覽器中就可以訓練自己的神經網絡,還有酷酷的圖像讓我們更直觀地瞭解神經網絡的工作原理。今天,就讓硅谷周邊帶你一起去Tensorflow遊樂場快樂地玩耍吧!
昨天,Google深度學習部門Google Brain的掌門人,也是Google裏受萬衆景仰的神級別工程師Jeff Dean,在Google Plus上發佈了Tensorflow遊樂場的消息:
於是小夥伴們都十分激動地去Tensorflow的網站上玩神經網絡了!遊樂場的地址是:http://playground.tensorflow.org。讓我們快點一起去看看遊樂場裏有哪些好玩的東東吧。
一打開網站,就看見上面的標語:
“在你的瀏覽器中就可以玩神經網絡!不用擔心,怎麼玩也玩不壞哦!”
這簡直太令人振奮了!面對這麼多可以隨便點的按鈕,咱們從哪兒開始呢?
首先讓我們來看看數據。在這個遊樂場中,我們有4種不同形態的數據可以玩:
每組數據,都是不同形態分佈的一羣點。每一個點,都與生俱來了2個特徵:x1和x2,表示點的位置。而我們數據中的點有2類:橙色和藍色。我們的神經網絡的目標,就是通過訓練,知道哪些位置的點是橙色、哪些位置的點是藍色。
如果橙色是橙子,藍色是藍莓。假設我們有2000個散落在各處的橙子和藍莓。前1000個,我們知道座標(1,1)的是藍莓,(2,2)的是橙子,(0.5,0.5)的是藍莓等等。我們要用這些信息來訓練我們的神經網絡,讓它能夠準確地預測出後1000個哪些是橙子、哪些是藍莓。
看上面的4組數據,我們會發現,前3中都能相對簡單地區分開,而最後一組螺旋數據會是最難的。
Tensorflow遊樂場中的數據十分靈活。我們可以調整noise(干擾)的大小,還可以改變訓練數據和測試數據的比例多少。下圖是不同noise的數據分佈。
當我們把每一個數據點的信息餵給機器學習系統時,我們需要做feature extraction,也就是特徵提取。如果我們真的是在區分藍莓和橙子的話,大小、顏色等等都會是我們的特徵。而這裏,每一個點都有x1和x2兩個特徵。除此之外,由這兩個特徵還可以衍生出許多其他特徵:
抽象來說,我們的機器學習classifier(分類器)其實是在試圖畫一條或多條線。如果我們能夠100%正確地區分藍色和橙色的點,藍色的點會在線的一邊,橙色的會在另一邊。
上面這些圖其實非常的直觀。第一張圖中,如果x1作爲我們的唯一特徵,我們其實就是在畫一條和x1軸垂直的線。當我們改變參數時,其實就是在將這條線左右移動。其他的特徵也是如此。
很容易可以看出,我們需要智能地結合這其中一種或多種的特徵,才能夠成功地將藍色點和橙色點分類。這樣的feature extraction,其實往往是機器學習應用中最難的部分。好在我們有神經網絡,它能夠幫我們完成大部分的任務。
如果我們選定x1和x2作爲特徵,我們神經網絡的每一層的每個神經元,都會將它們進行組合,來算出結果:
而下一層神經網絡的神經元,會把這一層的輸出再進行組合。組合時,根據上一次預測的準確性,我們會通過back propogation給每個組合不同的weights(比重)。這裏的線越粗,就表示比重越大:
下面就讓我們用最難的螺旋形數據,來試試這個神經網絡的表現吧!
在神經網絡出現前,我們往往會竭盡所能地想出儘可能好的特徵,把它們全都餵給系統。而系統會是個十分淺的系統,往往只有一層。用這樣的方法來完成分類。
讓我們先來實驗傳統的方法。在這裏,我們將所有能夠想到的7個特徵都輸入系統,並選擇只有1層的神經網絡:
最後的結果是這樣的,可以看出我們的單層神經系統幾乎完美地分離出了橙色點和藍色點:
接下來,讓我們來體驗神經網絡真正的魔法。神經網絡最大的魔力,就在於我們根本不需要想出各種各樣的特徵,用來輸入給機器學習的系統。我們只需要輸入最基本的特徵x1, x2, 只要給予足夠多層的神經網絡和神經元,神經網絡會自己組合出最有用的特徵。
在這次試驗中,我們只輸入x1, x2,而選擇1個6層的,每層有8個神經元的神經網絡:
最後的結果是這樣的。我們發現,通過增加神經元和神經網絡的層數,即使沒有輸入許多特徵,我們也能夠成功地分類:
神經網絡的偉大之處就在於此。當我們在解決分類橙色點和藍色點這樣的簡單問題時,想出額外的特徵似乎並不是難事。但是,當我們要處理的問題越來越複雜,想出有用的特徵就變成了最最困難的事。比如說,當我們需要識別出哪張圖片是貓,哪張圖片是狗時,哪些特徵是真正有效的呢?
而當我們有了神經網絡,我們的系統自己就能學習到哪些特徵是有效的、哪些是無效的,這就大大提高了我們解決複雜機器學習問題的能力,簡直是太酷啦!
看了以上的文章,你是不是對神經網絡有了更直觀的認識呢?好奇的小夥伴們,歡迎去http://playground.tensorflow.org/自己試試看,真的非常好玩!
線上分享|深度學習TensorFlow下的計算機視覺 - 知乎專欄
GitHub - wagamamaz/tensorflow-tutorial: Collection of TensorFlow tutorials
作爲TensorFlow社區的contributor (41/415),我來說說我的TensorFlow學習過程。
目前TensorFlow代碼已超過40w行,從代碼量上來看,絕不是一個能夠迅速上手的小項目。所以,想要精通TensorFlow的同學需要做好心理準備。
http://cloc.sourceforge.net v 1.64 T=45.33 s (68.5 files/s, 14956.6 lines/s)
--------------------------------------------------------------------------------
Language files blank comment code
--------------------------------------------------------------------------------
C++ 1084 33620 28397 185395
Python 988 43498 72410 160669
C/C++ Header 605 13609 23891 45446
HTML 100 1803 1572 24929
TypeScript 75 1836 4795 11681
Bourne Shell 60 1174 2147 4346
NAnt script 15 172 0 3328
CMake 28 298 495 1778
Protocol Buffers 43 555 1928 1337
Objective C++ 9 217 168 1186
Java 9 239 408 943
JSON 46 0 0 626
Go 9 93 244 544
make 3 96 112 542
Bourne Again Shell 4 52 91 310
Javascript 7 50 109 191
XML 18 97 205 149
Groovy 1 13 7 52
Objective C 1 10 13 21
CSS 1 4 11 6
--------------------------------------------------------------------------------
SUM: 3106 97436 137003 443479
--------------------------------------------------------------------------------
對於想要學習TensorFlow(以下簡稱TF)的人,根據目的不同,可以簡單分爲以下2類:
1. 研究學者,僅僅需要TF這個平臺實現深度學習算法,無需瞭解太多底層原理
2. 好學的行業內人員(比如我⊙﹏⊙),不僅需要了解算法模型,同時還要熟悉TF平臺的原理。在算子、通信、模型優化等方面進行平臺的二次開發的人。
研究學者:
你們可以考慮使用Keras,python寫的深度神經網絡庫,已經實現了絕大部分神經網絡,如:RNN、GRU、LSTM,CNN,Pooling,Full-Connected,以及sigmoid、tanh、Relu、PRelu、SRelu等各種激活函數。並且採用TF/Theano作爲後端計算引擎,自己本身擁有一套更高層的API,可以同時跑在TF/Theano平臺上。
相對於TF來說,這個學習壓力小了很多,我們公司負責算法的同事也是用Keras來寫模型,然後我再用TF的API來實現分佈式部署。
附:
Keras中文文檔
GitHub - fchollet/keras: Deep Learning library for Python. Convnets, recurrent neural networks, and more. Runs on Theano or TensorFlow.
開發人員:
對於我們這類人來說,首先需要弄清平臺的很多名稱、概念、定義, @賈揚清 曾說過TF有太多的Abstraction需要學習。誠然,這加大了我們的學習難度。但是,這也說明Google是想要把這個平臺做大做強的,所以纔會花時間去設計這一套框架和統一的結構。特別是讀了部分源碼後,更有這種感觸。
那麼,具體要怎麼開始呢?
極客學院有翻譯部分TF的官方文檔,對於初步瞭解Tensor、DAG、Operator、Variable、Device、Optimizer等是幫助的。在看完這些概念後,有一個MNIST的例子程序作爲TF的入門。這個樣例用一個簡單的Softmax實現了手寫體數字識別的神經網絡,只有一層參數。同時還介紹了Session、tf.placeholder、圖的計算等重要概念。
在看完這個樣例後,如果理解了DAG和Session,可以繼續看用卷積神經網絡實現的MNIST,準確率上升到了99%,相對於單層Softmax的92%左右,已經接近目前最高的準確率了。
附:
MNIST機器學習入門
深入MNIST - TensorFlow 官方文檔中文版
TF v0.8發佈了分佈式模型,我也研究了將近1個月,才把Seq2seq機器翻譯改造成了分佈式,但是現在公司不讓發佈出來ORZ。好消息是,我改寫了社區的MNIST分佈式程序,並且已經合併到master分支了。所以,如果想要繼續學習分佈式的話,我建議可以看一下那份代碼。比較遺憾的是,極客學院目前沒有翻譯分佈式的教程,所以大家得移步TF官網(貌似被牆了)。
由於分佈式的資料較少,我這裏簡單梳理下概念,大家在官網會看到他們的定義:
TF採用了PS/Worker的結構來定義集羣,其中
PS(parameter server):存儲variable(模型參數),主要負責參數更新和發放;
Worker:存儲operator,主要負責圖計算和梯度計算(TF使用Optimizer實現了自動化的梯度計算);
job:由於工作類型不同,用job_name來區分ps和worker
task:對於每個worker來說,具體做什麼任務(算什麼圖)也有可能不同,用task_index區分
device:指具體的CPU/GPU,通常PS綁定到CPU上,Worker綁定到GPU上,各取所長。
syncReplicaOptimizer:同步優化器,其本質仍然是用普通優化器進行梯度計算,但是通過Queue機制和Coordinator多線程協同實現了所有worker的梯度彙總和平均,最終將梯度傳回PS進行參數更新。
以上幾個概念對於分佈式的理解非常重要。當然,想要完全弄懂,還得不斷的看文檔和源碼。
源碼我推薦幾個python目錄下非常值得看的基礎類定義:
framework/Ops.py:定義了Tensor、Graph、Opreator類等
Ops/Variables.py:定義了Variable類
附:
分佈式官網教程
分佈式MNIST
tensorflow/ops.py at master · tensorflow/tensorflow · GitHub
tensorflow/variables.py at master · tensorflow/tensorflow · GitHub
最後,歡迎大家Follow我的Github賬號:
DjangoPeng (Jingtian Peng) · GitHub
個人感覺學習編程最好的方式就是:上來就是幹。Talk is cheap, show me the code !
內容包括:
1. Tensorflow 的基本結構, 用法;
2. 多層神經網絡 (迴歸 & 分類);
3. CNN 卷積神經網絡;
4. RNN 循環神經網絡;
5. LSTM 高級循環神經網絡;
6. Autoencoder 神經網絡的非監督學習;
7. 可視化助手 Tensorboard (查看學習結果, 參數變化, 神經網絡結構) 等等.
教程還附加了所需要的代碼, 可以用於練習, 是新手快速上路必看的教程. 有了視頻裏生動的形容, 比文字敘述上手快多了. 聽說很多人都是一晚上通宵看完的~ 大家一起加油吧!
系列教程視頻 Youtube 接口: https://www.youtube.com/playlist?list=PLXO45tsB95cKI5AIlf5TxxFPzb-0zeVZ8
優酷接口: 莫煩 tensorflow 神經網絡 教程
剛製作了 Tensorflow 視頻教程對應的學習目錄:莫煩 Python 視頻和輔助材料都很好的對應上了.
頻道還會一直有新的關於機器學習的內容不定時更新.
博客裏有一些相關鏈接, 是個人讀paper和學習tensorflow的時候做的筆記:
TensoFlow之深入理解GoogLeNetTensorFlow之深入理解AlexNetTensorFlow之深入理解Neural StyleTensorFlow入門一
新手向的Tensorflow學習之路(Learning paths)
文中的教程或者blog以及論文書籍基本上都是經典,推薦入門學習。
貼在這裏:
在學習Tensorflow的過程中磕磕碰碰,總結一些個人心得記錄於此,志同道合之友共勉~~
1.穩定的網絡:Tensorflow畢竟出自Google,官方文檔訪問不是很穩定。而且一般來說,對於英文的文檔,資料和疑問,Google搜索的結果要比Baidu好很多。(不是偏見,是各有所長,天氣地圖電影啥的,百度還是做的很好的)
2.Github:這是個開源程序的網站,Linux內核就在這個網站託管。Github的核心是Git,一種版本控制系統,已經逐漸取代SVN。這個網站託管了很多高質量的或者說世界頂尖的開源項目,比如Tensorflow。學習一下這個網站如何使用,註冊個賬號,學習一下Git的使用方法。這個網站有自己的tutorial和guide。
3.Linux: Tensorflow的主要運行平臺就是Linux,目前在Windows上運行的方案是虛擬機,但是深度學習對計算要求還是比較高的,虛擬機效率不是太高,因此還是推薦在原生Linux中運行。新手推薦發行版是Ubuntu 或者Linux mint。這個可以自行搜索。學習Linux也有很多好處,因爲很多開源軟件都only linux的。
4.Python:這是一種非常流行的腳本語言,龐大的第三方庫可以快速寫出短小容易理解的代碼,而且也是Tensorflow的推薦開發語言。教程太多了,這裏給幾個優秀的教程:官網教程,Learn Python the Hard Way,Python2.7教程
5.深度學習(Deep Learning,DL):雖然Tensorflow已經封裝好了大部分DL的細節,但是如果不瞭解DL的相關核心概念,就會很難着手分析問題。首先強烈推薦這個教程,通讀一遍,然後還有這個,可以快速瀏覽或者只看自己不太明白的地方,還有這個分塊介紹的,還有幾篇blog,這個和這個講的是卷積神經網絡。圖像識別用的比較多的就是卷積神經網絡,這兩篇可以看看。
6.Tensorflow:前面都是鋪墊,是爲了更好地使用Tensorflow。官方的文檔不錯,可以從get started然後tutorial看起,有個中文的翻譯版,但是更新不及時(官方已經v0.11,這個可能是v0.8或者v0.7),可能有坑,可以和英文對照着看,還有個Tensorflow的教程,也不錯。有篇FIRST CONTACT WITH TENSORFLOW也不錯。
7.優秀博客:Hackery, Math & Design,Mike Bostock,http://colah.github.io/,Welcome! | Irene's Blog on WordPress.com,這幾個都是我在學習中遇到的非常nice的blog,有時間讀讀定會有所收穫。
8.經典論文及書籍:收集了一些DL的經典論文&書籍,有些雜亂,不過幾乎都是經典,各取所需吧。百度雲地址(密碼: 4w91)。各位有更好的歡迎推薦,我會整理上傳。
9.幾篇原創TF相關文章(持續更新):如何理解TensorFlow中的batch和minibatch,結合TensorFlow PlayGround的簡單神經網絡原理解釋
其中,Python,DL,Tensorflow是重點,其他都是輔助, 自己感覺夠用即可,無需深入。學習中遇到困難首先向搜索引擎詢問。
2016.10.15 更新:更新了提及的軟件版本號,添加了第九部分原創TF相關博文
2016.8.8 更新:更新了提及的軟件版本號
2016.7.27 更新:重新排版,上傳了資料
2016.7.6 更新:重新排版
- TensorFlow: Large-scale machine learning on heterogeneous systems
- First
Contact With TensorFlow
- tensorflow.org 的頁面
- GitHub - tensorflow/tensorflow:
Computation using data flow graphs for scalable machine learning
- GitHub - aymericdamien/TensorFlow-Examples: TensorFlow tutorials and code examples for beginners
本文寫給機器學習和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)
正如前面提到的每個 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]))
注意,W 的形狀 [784,10] ,是因爲我們想要 784 三維圖像向量乘以它輸出10 維向量以標識的不同類。b形狀是 [10],這樣我們可以將其和輸出相加。
現在,我們可以實現我們的模型。它只需要一行代碼 !
y = tf.nn.softmax(tf.matmul(x, W) + b)
就是這樣。我們只花了一行代碼來定義我們的模型。不是因爲 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]))
現在,我們知道我們想要我們的模型做什麼,它是很容易通過 TensorFlow 去訓練它。因爲TensorFlow 瞭解整個圖的計算,它可以自動使用反向傳播算法有效地確定你的變量是如何影響成本函數並把它最小化。然後,它可以應用您所選擇的優化算法來修改變量和降低成本函數。
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
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
歡迎掃描二維碼:
- 看Paper,瞭解TensorFlow核心概念
- 看官方文檔,瞭解Usage
- 參照文檔寫Demo
- 使用TensorBoard加深印象
- 搭建分佈式TensorFlow
- 學習深度學習算法
- 寫更多的Demo
- 學更多的深度學習算法
- 寫更多的Demo
- 參與TensorFlow社區討論
- 看TensorFlow源碼
入門最佳拿好不謝
### 2016.11.10 update ###
由於一直做的是文本,基於圖像數據的項目都沒怎麼仔細看過,昨天完整讀了官方[cifar10](tensorflow/tensorflow/models/image/cifar10 at master · tensorflow/tensorflow · GitHub)整個項目的代碼,驚覺這不就是完美的tensorflow項目架構嗎!
因此,對於已經看過一定tf代碼的童鞋,一定要看官方cifar10的整個項目邏輯。醍醐灌頂,非常有幫助。
至於爲什麼是先看過一定代碼,原因是隻有看了很多項目組織代碼的爛方式後,才能發現這其中的精妙所在呀!
我補充一個連接: https://www.udacity.com/course/viewer#!/c-ud730/l-6370362152/m-6379811815 這個是Udacity 谷歌給的deep learning 課程,代碼就在tensorflow源碼裏面。幾個作業很有趣。課程畫風很可愛,主要是跟着官方Tensorflow的習慣來的,講解理論的時候會比較照顧得到,比如CNN部分的padding什麼的命名都是嚴格按照TF方法裏的標準。
不過建議大家不要把這門課用來入門上手,理論部分講解的可能不適合入門級。作業代碼可能也需要花點時間去理解。
我也放個blog地址,初學者歡迎大家交流評論:Welcome! | Irene's Blog on WordPress.com
-----再次更新-----
聽說大天朝對tf的官網有限制,所以這裏有一箇中文網站 TensorFlow中文社區
不過鑑於TF官方一直在更新,中文翻譯可能相對落後。有跟去年就開始使用tf的朋友聊過,他說現在看官方的代碼和以前他學習的時候有點不一樣了。所以還是儘量多去官網看。
另外,在學習官方tutorial的時候,有些方法在API裏沒有找到,師兄的建議是要去源碼裏看。比如LSTM那裏,所有的gate都隱藏在cell方法裏,要找到進去看纔會理解吧。爲此,我從Jupyter Notebook特意換上PyCharm,因爲這樣比較容易trace。
官方tutorial也是。。。醉人。。。我猜每個section都是不同的人寫的,思路也有點不一樣。。。。。
有新方法再更,就醬。