如何高效的學習 TensorFlow 代碼?
如題,或者如何掌握TensorFlow,應用到任何領域?
相關問題:MXNet的代碼要怎麼讀?
作為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
TL;DR:有同學反應資源太多不知道從何看起,或者有點基礎了想快速上手,因此就直接把幾個比較好的教程放在這裡,後面的內容作為參考。
- Stanford的CS 20SI課程,專門針對TensorFlow的課程,Tensorflow for Deep Learning Research
- 兩本書籍:TensorFlow Machine Learning Cookbook以及TensorFlow for Machine Intelligence,這兩本網路均有pdf版本,請自行搜索。
- Udacity公開課,深度學習
有些技術(網路方面)在知乎是不適合公開討論的,因此還是要貼上自己這篇博客的鏈接:新手向的TensorFlow學習之路2(Learning paths 2)
前言:其實TensorFlow本身僅僅是一個分散式的高性能計算框架,想要用TF做深度學習,僅僅學習這個框架本身是沒有太大意義的。因此應該將TF看作技術路線中的一個核心點,去掌握整個開發所需要的必要技術,知識。尤其是深度學習的基本原理,這對日後搭建模型,模型調參以至提出新的模型都是極其有用的。
第一篇學習之路寫於2016年6月份,時過境遷,特別是深度學習這個日新月異的領域,隔了那麼久,不得不說已經有些過時了,並且隨著學習的深入,越發覺得之前的學習之路過於籠統,加之TensorFlow發布了1.0正式版,因此整理一下,再次寫一篇。這次在內容的結構上將會大體分為三種,首先是公共基礎部分,這個無需多解釋。另外,一個是偏嚮應用性質的快節奏(fast peace),針對不想也沒必要深入了解理論知識希望儘快應用的人群,另一種是偏向研究性質的人群(hard way),針對例如研究生之類希望深入理論知識的人群。當然,hard way的前提是fast peace。但是寫法上,並沒有分別寫,因為某種意義上這兩種是相互包含的,分開寫會顯得冗長與重複,因此採用粗體標記提示特定部分是屬於哪一種。
1. 穩定的網路【公共基礎】:這是個不是技術的技術,TensorFlow畢竟出自Google,官方文檔訪問不是很穩定。
2. Github【公共基礎】:這是個開源程序的網站,Linux內核在這個網站也有鏡像。Github的核心是Git,一種版本控制系統,已經逐漸取代SVN。這個網站託管了很多高質量的或者說世界頂尖的開源項目,比如TensorFlow。學習一下這個網站如何使用,註冊個賬號,學習一下Git的使用方法。這個網站有自己的tutorial和guide。而且後期自己的項目管理多半也會用到git,所以,早點學習肯定是有好處的。
【fast peace(即簡略的快節奏教程,下同)】:
1. Git 參考手冊(推薦)
2. git – the simple guide
3. Git – Quick Guide
【hard way(即大而全的完整或者正式教程,下同)】:
1. Pro Git與Git的參考文檔
2. Git – Tutorial
3. Git Tutorial
3. Python【公共基礎】:這是一種非常流行的腳本語言,龐大的第三方庫可以快速寫出短小容易理解的代碼,而且也是TensorFlow的推薦開發語言。不僅僅是對於TensorFlow這門語言很重要,對於整個機器學習,應用層面放眼望去基本就是Python與R的天下了,而R更偏向與統計學領域,深度學習Python簡直是紅透了半邊天,當然我是針對初學者,如果已經掌握了其他語言,例如Java,C++,那麼其實理論上而言可以不用掌握Python,選擇自己熟悉的語言的API即可。但是對於TensorFlow,只有Python的API最全面,文檔社區也最完善(截至2017年3月),當然隨著TensorFlow的發展都會完善,可是現在就要用呀:)。而且,最重要的是,對於已經掌握其他語言的人來說,學習Python不會花費太久的。並且,Pytohn寫起來短小精悍,易於理解,很適合這種用來搭架子調用框架而且不怎麼需要考慮效率的場景(一般來講,最需要效率的部分框架會用C++實現,Python僅僅是作為頂層去調用)。另外,推薦學習Python3,這才是Python的未來,2.7的支持在2020年會停止。而且,後面會知道的,對於Python2.7向3的支持很多情況僅僅是import幾個future包。
【fast peace】:
1. Tutorial – Learn Python in 10 minutes
2. Python Quick Guide
3. Google』s Python Class
【hard way】:
1. 廖雪峰的Python教程
2. The Python Tutorial
4. Linux【公共基礎】:TensorFlow的主要運行平台之一就是Linux,但是正式版對Windows的支持日趨完善,真的沒時間學習Linux平台可以先在Windows上運行TensorFlow。不過,學習Linux真的用不了多久(當然是指做開發環境日常日用,立志做系統管理員還是要下一番功夫的)。推薦Ubuntu 16.04 LTS,這不僅是「新手友好」的發行版,也是Google很多產品的官方支持版本,官方支持就會帶來很多便捷以及少一些」坑「。LTS(長期支持版本)的加成保證了系統的穩定(穩定不僅指運行穩定,更是指軟體環境,例如python不會突然默認變成3.6,gcc不會突然就默認變成6,插一句,之所以這麼說,是因為以前用的是Arch,裝了TensorFlow一直跑的很開心,直到有天突然發現跑不起來了,原來是Arch升級了一下Python的默認版本變成了3.6了XD。)
【fast peace】:
1. 我的知乎回答
【hard way】:
1. UNIX Tutorial for Beginners
2. Linux Tutorial
3. Linux工具快速教程
5. 深度學習–概念與基礎:
【fast peace】(偏向概念介紹,introduction):
1. 深度學習wiki
【hard way】(偏向概念解釋,數學推導,基本原理):
兩本經典中的經典書籍:第一本傾向於理論闡述,第二本則是傾向於直觀解釋。
1. Deep Learning
2. Neural Networks and Deep Learning
第三本則是代碼應用向的,使用Theano從零搭建各種常見的網路結構,雖然是Theano,但是基本思想是統一的。
3. Deep Learning Tutorials
6. Python常用科學計算庫【公共基礎】:
1. Numpy
2. Sklearn
3. Matplotlib
4. Pandas
雖然說是公共基礎部分,但是系統學習這幾個庫,也不是一件容易的事,而且很耗時間。因此還是遵循夠用即可的原則。但是還是想列在這裡,因為後來發現如果這幾個庫掌握的比較熟練,數據預處理後處理都能極大地節省時間,當你還在苦苦想如何設計預處理方法的時候,其實去查一查手冊,大概率在這幾個庫里已經寫好了。這幾個庫的官方文檔都很優秀,比如Pandas的10 Minutes to pandas。因此,閑余時間多看看官方tutorial即可。
7. TensorFlow:
【fast peace】(偏嚮應用性質,到手即用,pretrained-models,tflearn,keras等):
1. TensorFlow的白皮書,對TensorFlow的整體有個把握或者說印象是很有必要的,對後期的「圖編程」,優化,都很有啟發。
2. TFLearn,基於TensorFlow的高級API,不需要了解太多細節,應用向的可以直接看這個。
3. TFSlim,基於TensorFlow的高級API,和TensorFlow契合度更好。
4. Keras,高級API,後端可以使用TensorFlow(默認)
【hard way】(偏向理論性質,調用基本API手寫,自定義layer,自定義kernel,自定義optimizer等):
- 官網教程,Get Start,Programmer』s guide,Tutorials,Performance過一遍。
- Google的Udacity課程
- Stanford的CS20SI課程
8. 論文閱讀路線圖【hard way】: github上有個很有名的Deep Learning papers reading roadmap,已經過萬stars,從事深度學習科研者的必讀清單,在我寫的上一篇學習之路中,雖然整理了很多論文,但是過於雜亂,在此就不做引用啦。
9. 相關博客等其他資源:
- 先放上我的博客啦(笑)
- Beginner-level tutorials for a powerful framework
- CS231n: Convolutional Neural Networks for Visual Recognition
- CS224n: Natural Language Processing with Deep Learning
- UFLDL Tutorial
- UFLDL教程(上面UFLDL Tutorial舊版,但是是中文的)
- First Contact With TensorFlow
- Deep Learning
- Deep Learning For Coders-36 hours of lessons for free(一個不錯的視頻教程)
- colah』s blog(推薦,寫了很多晦澀概念可視化的博客)
- DeepLearning4J(雖然是一個面向Java的深度學習框架,但是文檔很好,通用性也很強)
- Chris McCormick · Machine Learning Tutorials and Insights(這個和下面的幾個都是不錯的博客,推薦關注)
- Daniil#x27;s blog
- Café, bonne nuit
- Hackery, Math amp; Design
10. 不錯的資源類網站:
- arxiv-sanity
- GitXiv
---------------------------------舊答案的分割線---------------------------------
已更新。
發一波預告~最近剛用tensorflow搞完一個算是接近實際並且帶有移動端應用外加inception retrain的項目,打算考試結束更新一波~:)
TensorFlow已經發布1.0版本!
已更新。
近期更新計劃:
1.重新整理Learning path,將各個部分更加詳盡闡述,同時給出合適的快速入手教程。
2.及時跟進最新進展,刪除陳舊信息。
我在blog中總結了學習路線,針對新手。
新手向的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看起,有個中文的翻譯版,但是更新不及時(官方已經v1.0,這個可能是v0.8或者v0.7),可能有坑,可以和英文對照著看,還有個Tensorflow的教程,也不錯。有篇FIRST CONTACT WITH TENSORFLOW也不錯。
7.優秀博客:Hackery, Math amp;amp;amp;amp;amp;amp; Design, Mike Bostock, http://colah.github.io/, Café, bonne nuit這幾個都是我在學習中遇到的非常nice的blog,有時間讀讀定會有所收穫。
8.經典論文及書籍:收集了一些DL的經典論文書籍,有些雜亂,不過幾乎都是經典,各取所需吧。百度雲地址:(已刪除,內容上有些陳舊了,並且百度雲總是封殺鏈接)。各位有更好的歡迎推薦,我會整理上傳。
9.幾篇原創TF相關文章(持續更新):如何理解TensorFlow中的batch和minibatch,結合TensorFlow PlayGround的簡單神經網路原理解釋,TensorFlow從源碼安裝,利用TF重訓練Google Inception模型,在Android端使用TensorFlow
其中,Python,DL,Tensorflow是重點,其他都是輔助, 自己感覺夠用即可,無需深入。學習中遇到困難首先向搜索引擎詢問。
2017.9.23 更新:更新部分鏈接以及資源描述
2017.7.31 更新:添加了一些推薦資源,序號重新排版,在首部重點推薦了幾個教程,方便快速上手
2017.7.30 更新:修正一些排版問題,刪除百度雲鏈接,增加CS 20SI課程
2017.5.16 更新:更新失效的百度雲地址
2017.4.3 更新:修正筆誤,同時加了前言
2017.3.30 更新:修正一些筆誤
2017.3.28 更新:完成了近期更新計劃,重新整理了所有內容,同時及時跟進了新的內容
2017.2.17 更新:更新了在移動端使用TF的項目筆記,添加了近期更新計劃
2016.11.25 更新:更新預告
2016.10.15 更新:更新了提及的軟體版本號,添加了第九部分原創TF相關博文
2016.8.8 更新:更新了提及的軟體版本號
2016.7.27 更新:重新排版,上傳了資料
2016.7.6 更新:重新排版
推薦看這個系列視頻教程, 有Tensorflow一整套的從入門到較高級運用的詳細講解.
內容包括:
1. Tensorflow 的基本結構, 用法;
2. 多層神經網路 (回歸 分類);
3. CNN 卷積神經網路;
4. RNN 循環神經網路;
5. LSTM 高級循環神經網路;
6. Autoencoder 神經網路的非監督學習;
7. 可視化助手 Tensorboard (查看學習結果, 參數變化, 神經網路結構);
8. Batch normalization 批標準化 等等;
教程還附加了所需要的代碼, 可以用於練習, 是新手快速上路必看的教程. 有了視頻里生動的形容, 比文字敘述上手快多了. 聽說很多人都是一晚上通宵看完的~ 大家一起加油吧!
自己製作的 [莫煩 Python] 學習網頁也上架了: 莫煩 Python
視頻和輔助材料都很好的對應上了. 讓你的學習效率飛速提高!網頁內有很多其他內容, 歡迎隨便溜達.
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/自己試試看,真的非常好玩!
http://weixin.qq.com/r/2Dno8IjEWNUnrcyT92zK (二維碼自動識別)
回來補充下,給一個學習線路:
- 看Paper,了解TensorFlow核心概念
- 看官方文檔,了解Usage
- 參照文檔寫Demo
- 使用TensorBoard加深印象
- 搭建分散式TensorFlow
- 學習深度學習演算法
- 寫更多的Demo
- 學更多的深度學習演算法
- 寫更多的Demo
- 參與TensorFlow社區討論
- 看TensorFlow源碼
再補充一點,參與TensorFlow源碼開發,社區非常願意接受Github Pull-request Update the directory of cuDNN in doc of install cuda by tobegit3hub · Pull Request #3118 · tensorflow/tensorflow · GitHub
自TensorFlow發布以來,我們就一直在和裡面的各種坑做鬥爭。
對於TensorFlow這種一個月一更的東西來說(1.0版的Python API加入了API stability promises,咱們等著看他們什麼時候打破這個承諾),我覺得所謂「學會TensorFlow」這件事情根本就不存在。
事實上,如何給深度學習找到好的應用場景,以及這些應用反過來對於演算法和框架有怎樣的需求,是在過去的幾年裡一直高速演變著的。比如,TensorFlow Fold現在能夠支持動態計算圖了。有理由相信TensorFlow在未來依然會迅速地演進。所以我認為學習TensorFlow最大的坑,莫過於常常發現網上所有的例子和教程,在升級以後就全都不work了(包括官方的很多sample),然後安裝最新版的CUDA和cuDNN又把你折騰得夠嗆,最後發現官方的bazel script有bug。。。
既然如此,我們不如來看看哪些事情是不會變的。
? TensorFlow從抽象的層面來看,可以認為是一套支持各種Tensor操作的計算平台(我一直是這麼去看它的),以及在此基礎之上的一個深度神經網路包。在我看來,這是TF最大的一個設計特點。在這套平台上,深度神經網路只是可能的應用之一,最近發布的基於TensorFlow的概率編程語言Edward(Edward - Home)就是應用TF的一個例子。事實上,無論你用TensorFlow去做什麼任務,都能夠輕易地獲得在架構極為不同的多種設備(無論是手機,PC,還是GPU集群)上運行的能力。所以TF的核心無疑是計算圖和各種操作。TensorFlow的這種抽象,當然是需要底層的支持,這些底層的支持在tf這一級API里,以及原生的代碼當中。
? 在此基礎上,TF實現了一組適用於深度神經網路的特性,其中比較顯著的是自動計算梯度,如下圖所示:?
TF實現了支持神經網路的操作符,位於tf.nn,以及優化方法,位於tf.train。
?
TF又包裝了一些常用的神經網路結構,位於tf.contrib.layers,以及tf.contrib.rnn,以及tf.contrib.seq2seq。
?
TF也包括一些更高抽象級別的庫,比如tf.contrib.learn,或者將進入TF core的keras...(撒花)
所以針對不同的應用,不同的需求,對於TF的學習也應該是不同的。對於簡單需要利用TF進行機器學習應用的同學來說,也許直接去學習keras就足夠了;對於研究者來說,一般只需要在Layer這一級別進行一些創作;對於研究更底層的基礎演算法的同學,也許還需要自己去實現一些新的計算操作;但是對於需要在大規模GPU集群上做生產級應用的同學來說,就必須要深入到最底層的實現來優化性能。所有上面所說的這些,都並不依賴於TF的具體版本——更重要的,是知道自己需要什麼,以及如何在TF所提供的框架中實現此構想。如果這樣都無法滿足的話,勇敢地自己造輪子吧!(CMU最近實現的DyNet就是個很好的例子。。)
本回答來自Emotibot機器學習科學家馬永寧。
我是這樣學習的,個人比較關注cv這塊的內容,所以我會去看看一些經典的cv模型,比如alexnet,googlenet,vgg,deep residual network等等,然後我會去找找相關的tensorflow的代碼實現,在讀完paper後,去看相關的代碼結構,發現很容易,也更能理解paper,還有一些比較火的cv的應用的例子,我都會去看看相關的paper,如果沒有基於tensorflow的源碼,我會去自己嘗試去寫下,這樣學起來更優針對性,也更有意思
博客里有一些相關鏈接, 是個人讀paper和學習tensorflow的時候做的筆記:TensoFlow之深入理解GoogLeNetTensorFlow之深入理解AlexNetTensorFlow之深入理解Neural StyleTensorFlow入門一
First Contact With TensorFlow,和TensorFlow官方文檔中文版_TensorFlow中文教程_TensorFlow開發中文手冊[PDF]下載
入門最佳拿好不謝
### 2016.11.10 update ###
由於一直做的是文本,基於圖像數據的項目都沒怎麼仔細看過,昨天完整讀了官方[cifar10](tensorflow/tensorflow/models/image/cifar10 at master · tensorflow/tensorflow · GitHub)整個項目的代碼,驚覺這不就是完美的tensorflow項目架構嗎!
因此,對於已經看過一定tf代碼的童鞋,一定要看官方cifar10的整個項目邏輯。醍醐灌頂,非常有幫助。
至於為什麼是先看過一定代碼,原因是只有看了很多項目組織代碼的爛方式後,才能發現這其中的精妙所在呀!
如何開始學習使用TensorFlow?
Harrison Kinsley ——http://PythonProgramming.net的創始人
TensorFlow官方網站有相當多的文檔和教程,但這些往往認為讀者掌握了一些機器學習和人工智慧知識。除了知道ML和AI,你也應該對Python編程語言非常熟練。因此,在開始學習如何使用TensorFlow前,首先學習更多的Python語言,而不是與機器學習直接相關的任何東西。
1、假設熟練Python,但不會機器學習,那麼可以查看這個機器學習實踐w / Python教程,其中涵蓋了與機器學習相關的概念、演算法、理論、應用程序等;
2、如果已經掌握了Python和機器學習的基礎知識,但還不知道Deep Learning / TensorFlow,那麼可以從神經網路介紹部分開始 。
3、如果已經知道神經網路/深度學習,那麼可以從安裝TensorFlow教程開始,或者可以從TensorFlow基礎教程開始,這將直接導致實際建模一個深層神經網路。
Parag K Mital ——Kadenze Inc.機器智能總監
剛剛推出了一個關於Tensorflow的新課程:使用TensorFlow |創建深度學習應用程序
Kadenze與其他課程不同,這是一個以應用為導向的課程,通過鼓勵探索創造性思維和深層神經網路的創造性應用,教你Tensorflow的基礎知識以及最先進的演算法,強烈鼓勵嘗試這門課程。這是唯一全面的在線課程,將教會你如何使用Tensorflow和開發您的創造潛力,了解如何應用這些技術創建神經網路。
課程資料:
本課程將介紹深度學習:構建人工智慧演算法的最先進的方法。涵蓋深度學習的基本結構、意義,原理並開發必要的代碼搭建各種演算法,如深卷積網路,變分自動編碼器,生成對抗網路和循環神經網路。本課程的主要重點是了解如何構建這些演算法的必要結構以及如何應用它們來探索創意應用程序。
計劃表
學期1:Tensorflow簡介
介紹數據與機器和深度學習演算法的重要性,創建數據集的基礎知識,如何預處理數據集,然後跳轉到Tensorflow。此外將學習Tensorflow的基本結構,並了解如何使用它來過濾圖像。
學期2:訓練一個網路W / Tensorflow
將看到神經網路如何工作,網路是如何「訓練」。然後將構建自己的第一個神經網路,並將其用於訓練神經網路如何繪製圖像的應用程序。
學期3:無監督和監督學習
探索能夠編碼大型數據集的深層神經網路,並了解如何使用此編碼來探索數據集的「潛在」維度或生成全新內容。還將學習另一種類型的執行辨別學習的模型,並了解如何使用它來預測圖像的標籤。
學期4:可視化和幻化表示
指導執行一些真正有趣的可視化,包括可以產生無限生成分形的「深度夢想」或者「風格網路」,它允許我們將一個圖像的內容和另一個圖像的風格結合起來自動生成藝術美學。
學期5:生成模型
最後提供了一些未來生成建模方向的預測,包括一些現有技術模型,例如「生成式對抗網路」,以及其在「變分自動編碼器」內的實現等內容。
Antonio Cangiano ——IBM軟體開發和技術推廣
大數據大學剛剛推出了一個免費的深層學習與TensorFlow課程。顯然還有其他有效的資源可用,但建議你看一下本課程。同樣查看目錄中的其他數據科學和機器學習課程。課程是完全免費的,並且許多都有完成證書和IBM支持的開放徽章。
Ian Dewancker ——SigOpt研究工程師
最好的學習方式可能是通過學習和實驗一個工作過的例子。在SigOpt有一個工作是通過TensorFlow示例調整一個卷積神經網路,該工程在github頁面鏈接:sigopt / sigopt-examples
下面簡短的視頻教程講授如何創建一個能夠運行TensorFlow代碼的AWS環境。該視頻還概述了並行探索CNN配置的簡單策略。
https://youtu.be/CGI_RKVnDpE
Ish Girwan ——在印度管理學院學習
作為初學者,可以使用以下資源:
學習TensorFlow aymericdamien / TensorFlow-Examples nlintz / TensorFlow-Tutorials Google TensorFlow教程 機器智能的開源軟體庫
Kuntal Mukherjee ——在Wipro Technologies工作
如果你是初學者,建議按照以下步驟學習:
1 首先快速學習Python。
2 學習AI和機器學習課程,可以嘗試MIT OCW。
3 從TensorFlow網站教程開始。如果你已經在這個領域經歷過,那麼可以去步驟(3)開始學習更高級教程。
Rodolfo Bonnin ——建築機器學習項目與Tensorflor 作家
最簡單的方法之一是查看和修改一些代碼示例與額外的注釋;
https://github.com/tobigithub/tensorflow-deep-learning/wiki
Ankit Sachan ——http://Ilenze.com的創始人
在開始的時候遇到了一些與困難。所以創造了一系列的教程。教程在Linkedin計算機視覺組上變得非常流行。
10分鐘實用TensorFlow快速學習教程?CV-Tricks.com
Angel Mario Castro Martinez ——在馬克斯普朗克學會工作
對我來說,最好的起點是主頁本身:
http://www.tensorflow.org/versio ...
安裝並習慣了如何處理數據和訓練模型的方式,你可以嘗試MNIST教程或其他幾個教程:
https://github.com/kronos-cm/Ten...
https://github.com/jasonbaldridg...
如果正在尋找一個壓縮版本的上述主題,可以嘗試:
https://medium.com/@ilblackdrago...
Suraj Vantigodi ——在印度班加羅爾理工學院工作
一個有用的鏈接學習TensorFlow,一旦完成後可以去Udacity課程深度學習| Udacity。
Kim Brian ——5年計算機編程經驗
除了使用TensorFlow,有很多其它可能的解決方案。如果你是一個熱心編碼的人,建議不要使用TensorFlow,直到你知道如何編碼基本的AI。
正如Kuntal Mukherjee先生所說,建議從基礎知識中學習。
Chirila Sorina ——在Iasi計算機科學學院學習
請查看以下兩個答案:
TensorFlow(開源s / w庫):如何使用張量流,什麼是更好地了解它的最佳方式? 使用TensorFlow處理自然語言的具體步驟有哪些?
Ashwin D Kini ——喜歡閱讀的Web開發人員
猜猜你沒有訪問過這個網站:
http://www.tensorflow.org/tutori...
對於初學者:
http://www.tensorflow.org/tutori...
Tuan Vu ——數據據科學家
如果你想了解張量流的基本結構,這個網站可能有幫助:學習TensorFlow Kishore Karunakaran ——Vanenburg Software高級軟體工程師
Tensorflow的教程:學習TensorFlow
Lifu Yi ——Mindx.ai的首席執行官
等待下一個更好的版本再學習它,當前版本的結構導致其糟糕的績效考核。
原文鏈接:實踐指南!16位資深行業者教你如何學習使用TensorFlow-博客-雲棲社區-阿里雲
本來都忘了這個問題了,不過看到很多人也在關注,也是開森。
我補充一個連接: 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都是不同的人寫的,思路也有點不一樣。。。。。
有新方法再更,就醬。
基於TensorFlow的教學資源非常多,中英文的都有,比如Udacity的Deep Learning課程,Coursera上的Machine Learning課程,還有Stanford提供的課程錄像,比如CS231n和CS224n。另外,被稱為深度學習聖經的《Deep Learning》也在網上(http://deeplearningbook.org)免費提供。這對於學習TF都是非常有幫助的。Google做社區非常有一套,在中國有專門的一群人,會在第一時間把Google的開發者相關的進展翻譯成中文。
如果身邊有人可以提供指導,直接尋求幫助一定是最有效的。如果身邊沒有這樣的人可以提供幫助,那麼StackOverflow是在線尋求幫助的首選。Google的TensorFlow開發團隊會有人專門在StackOverflow上回答問題,當然除了Google的人,還有很多熱心的開發者提供幫助。
文/ThoughtWorks佟達
講真還是谷歌家的教程最好,一個是 Udacity上的Deep learning教程,一個是Youtube上的Machine learning教程,可以到這個Github查看相應的筆記,也有相應的視頻地址:GitHub - ahangchen/GDLnotes: Google Deep Learning筆記(TensorFlow)GitHub - ahangchen/GoogleML: Google機器學習教程筆記(基礎版)
目前tensorflow對linux和mac的原生支持很友好,對windows 7,10和windows server 2016的原生支持友好。我在windows 10上跑char-rnn訓練和預測都沒有問題,但在windows server 2008上讀訓練好的模型進行測試的時候有問題(tensorflow 0.12版,cuda8.0,路徑存在而且正確,模型checkpoint相關文件也正確,可就是報錯「找不到」,在線等)。
代碼:
言歸正傳
1.看廖雪峰的Python教程,熟悉Python的基本語法和特性,比如迭代器(列表生成表達式),生成器(yield關鍵字,節省內存),裝飾器(設計模式),高階函數(函數的函數),匿名函數(lambda表達式),返回函數(閉包),位置參數,默認參數,可變參數,常用模塊,定製類,枚舉類,元類,理解動態特性。
2.然後跑Github上tensorflow/models里的應用模型:
如果熟悉自動編碼器,就先看autoencoder;如果熟悉計算機視覺,就看compresssion(圖像壓縮),im2txt(圖像描述),inception~resnet殘差網路~slim(圖像分類),street(路標識別或驗證碼識別),;如果對NLP比較感興趣,可以看lm_1b(語言模型),namignizer(起名字),tutorials里的word2vec以及swivel(詞向量),syntaxnet(分詞和語法分析),textsum(文本摘要);還有char-rnn-tensorflow;對模型調試並調參;這些教科書式的代碼。
3.另外,這裡TensorFlow-Examples,也有大量的基於tensorflow實現的例子,不僅包括更加豐富的深度學習模型,還有一些機器學習的實現。
4.關於參考文檔,因為版本更新較快,而且變化也略大;在python shell里查看當前所使用tensorflow版本的API,方便而且準確,比如help(tf.nn.ctc_loss):
5. 如果熟悉增強學習,或者想進階到增強學習,深度學習玩遊戲,推薦跑這個DeepLearningFlappyBird:
原理分析Guest Post (Part I): Demystifying Deep Reinforcement Learning - Nervana。
我最近在使用Tensorflow。為此,我換上了ubuntu,用上了python。總的來說,在了解了神經網路等基本內容之後,再看官方教程比較容易懂。僅就代碼而言,如果已經熟悉python,那麼看不懂的地方查看API即可。我個人覺得開始時最大的難點在於Tensor維度的設計,整個系統的運行機理,以及數據的輸入。先搞懂這幾塊,應該之後學起來快一些。
oop讀代碼作業要到ddl了,馬克下等菊苣們|?ω?`)
Tensorflow的確設計的不錯,我的學習進度是先看demo對照demo查看文檔。其實它和theano有需要相似之處,比如圖計算模型,惰性計算,不過個人覺得要理解tensorfolw張量的模型特別重要,tensorflow seving構建需要谷歌的依賴,有大坑。
如果只是基於 tensorflow 訓練做應用的話,沒必要去學習 tensorflow 核心代碼,只要看官方文檔順帶著偶爾看看 python 部分就夠了。
cpp 執行部分的話,把 http://direct_session.cc 到 http://executor.cc 看完其他基本都不是事了。分散式和圖優化那些算進階項。
也在學習中。
個人感覺先把TensorFlow的白皮書:http://download.tensorflow.org/paper/whitepaper2015.pdf
這個論文整明白了,大致模型就明白了。然後學習demo。最後再深入整個代碼。
白皮書有個快翻譯完的中文版:[譯] TensorFlow 白皮書
------------------------------------------------------------------------------------------------------------
最近陸續更新了一些學習筆記,與初學者共享:
SHINING的博客
可以看這裡翻譯的教程哦 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
歡迎掃描二維碼:
做項目,敲代碼,看書。
FaceRank-人臉打分基於 TensorFlow 的 CNN 模型,這個妹子顏值幾分? FaceRank 告訴你!《周末小福利》
機器學習是不是很無聊,用來用去都是識別字體。能不能幫我找到顏值高的妹子,順便提高一下姿勢水平。
FaceRank 基於 TensorFlow CNN 模型,提供了一些圖片處理的工具集,後續還會提供訓練好的模型。給 FaceRank 一個妹子,他給你個分數。
從此以後篩選簡歷,先把頭像顏值低的去掉;自動尋找女主顏值高的小電影;自動關注美女;自動排除負分滾粗的相親對象。從此以後升職加薪,迎娶白富美,走上人生巔峰。
知乎專欄:FaceRank-人臉打分基於 TensorFlow 的 CNN 模型,這個妹子顏值幾分? FaceRank 告訴你!《周末小福利》
知乎專欄:FaceRank-人臉打分基於 TensorFlow 的 CNN 模型,這個妹子顏值幾分? FaceRank 告訴你!《周末小福利》
GitHub:fendouai/FaceRank
推薦閱讀:
TAG:代碼 | 學習方法 | TensorFlow |