13個Tensorflow實踐案例,教你入門到進階

大資料探勘DT資料分析發表於2018-03-01

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

 向AI轉型的程式設計師都關注了這個號???


大資料探勘DT資料分析  公眾號: datadw


關於深度學習,每個人都有自己的看法。有人說就是煉丹,得個準確率召回率什麼的,拿到實際中,問問為什麼,都答不上來。各種連程式碼都沒寫過的人,也紛紛表示這東西就是小孩堆積木,然後整個大功耗的伺服器跑上幾天,調調引數。然後每個實驗室招生,都說自己是做什麼深度學習,機器 學習,大資料分析的,以此來吸引學生。可是可是,他們實驗室很可能連一塊 GPU 都沒有。

小時候,我把兩個5號電池連在一塊,然後用導線把正負極連起來,在正極的地方接個小燈泡,然後燈泡就亮了,這時候我就會高興的不行。家裡的電風扇壞了,把風扇拆開後發現裡邊的線斷了,接起來後又可以工作了,媽媽覺得我很了不起。其實我就是找到線斷了接起來而已。有時候,動手實現是一件很有趣的,也很有成就感的事。深度學習,我想就是這樣。我鄙視那些連程式碼都沒寫過,一點細節都不懂的人在那裡瞎吹。在傳統的學科中,比如數學,物理這些基礎學科或者建築,土木這樣的基礎應用中,也許一個碩士生,博士生苦苦研究很久都比不上他們的導師。但是在深度學習中,很多情況下,學生要比導師會得更多,特別是整天就想著拉專案賺錢,論文都沒看過,每天就看那麼幾 kb 推送的一些老師。

對於像我這樣的渣渣來說,深度學習的樂趣不在於推導那麼幾個公式,而在於你在做情感分析的時候,RMSE小了,準確率高了;你在做機器翻譯的時候,英文句子準確地變成了地地道道的中文;在你做行人檢測的時候,那個方框準確無誤的跟著人移動。。。所以 talk is cheap, show me your code.


Tensorflow-Tutorial

專案程式碼: https://github.com/yongyehuang/Tensorflow-Tutorial

我是從2月份才開始學習 Tensorflow 的,因為去年年底老師才終於肯買一臺伺服器。總體來說,TensorFlow更新的速度還是比較快的,但是用的是 1.0 版本,7個月過去,出了1.1, 1.2, 現在是 1.3 。 而且每個版本都有不少更新。比較坑的一點是官方文件很不齊全,有些東西雖然能夠實現得比較好,但是文件裡邊一個字都不提,只能自己哭瞎然後繼續尋找。下面是我學習過程中做的一些筆記。前面部分主要參考官方教程,後面則是自己在專案中的一些總結。因為時間跨度較大,程式碼中存在不少版本相容的問題,可能會出錯,但是思路還是沒問題的~

  • TensorFlow入門(一)基本用法 
    介紹 TensorFlow 變數定義,加減操作等基本知識。理解tensorflow的工作機制:首先建立一個個節點,這些節點構成以圖的結構相互作用;建立好的“圖”就像一個空殼,你需要啟動會話(Session)才能執行這些節點,這就像往這個空殼裡邊注入血液,讓它們迴圈活動起來。可直接參考官方教程。

  • TensorFlow入門(二)簡單前饋網路實現 mnist 分類 
    從第一次接觸深度學習開始,你就應該知道感知器這個東西,說白了就是個線性加權,也就是求特徵向量和權重向量的點積。從程式設計的角度來說就是兩個向量對應位相乘,最後求和。全連線網路就是有一個個這樣的感知器拼成的。 
    在這個例子中講的是簡單的全連線網路實現手寫字元分類,這個例子雖然簡單,但是實際上各種分類任務也就這樣。一般來說,都是包括三個部分:1.搭建網路, 2. 計算損失和梯度, 3. 設定優化器選擇合適的學習率更新權值。 可直接參考官方教程。

  • TensorFlow入門(三)多層 CNNs 實現 mnist分類 
    在前面簡單全連線網路的基礎上,本例子主要介紹怎麼用TensorFlow來寫一個卷積層。然後計算損失,梯度,優化器和前面簡單全連線網路沒有什麼區別。可直接參考官方教程。此外,我新增了檢視網路中間層權值的程式碼。

  • TensorFlow入門(四) name / variable_scope 的使用 
    一般來說,神經網路的引數都是非常多的,這麼繁多的結構,引數,程式碼寫起來亂得跟麻團一樣。 tf.name_scope 和 tf.variable_scope 這兩個東西主要作用就是用於命名管理,把亂糟糟的程式碼管理的井然有序。對於 tf.variable_scope 更有一個作用就是實現權重共享的功能。

  • TensorFlow入門(五)多層 LSTM 通俗易懂版 
    在第一次聽說 LSTM 這個名字的時候就是一種高大上的感覺,後來確實也是非常好用,誰用誰知道。不會LSTM都不好意思說自己做文字的,做序列分析的。和前面的 CNN 比較起來,感覺 LSTM 確實是要複雜一些,當時也是整了好久才弄明白其中的各個細節。不得不說,Understanding LSTM Networks這篇文章講得真是棒得不行。關於 TensorFlow 實現 LSTM,在每次版本更新的時候都做了一些調整,所以老是出錯,不想 CNN 那樣一直都沒變。不過好在現在TensorFlow討論的人越來越多了,所以很多問題谷歌一下或者到 stack overflow 上面都能找到。

  • TensorFlow入門(六)雙端 LSTM 實現序列標註(分詞) 
    這個例子是根據別人寫的一個分詞例子改過來的,原版使用 keras 寫的,然後我改成了 TensorFlow 版本。最大的變化就是,WTF,keras中一小段程式碼,我竟然寫了這麼多。但是自己實現幾個例子,確實能夠很好地幫助自己理解網路原理和程式碼細節。

  • TensorFlow入門(七)充分理解 name / variable_scope 
    之前已經說過了 name/variable_scope,但是對於一個初學者來說,要想好好地理解這兩個東西還真是不太容易,也許是我自己太菜了,但我確實是沒有好好地掌握它們的精髓。然後程式碼寫多了,才漸漸地理解。我一般的習慣是對於變數部分,我都喜歡使用 tf.variable_scope 包起來,結合 tf.get_variable() 使用,一方面是方便實現變數共享,另外一方面是有時候需要單獨初始化,或者使用不同的優化器,或者是模型融合,利用 variable_scope 幫助很大。而對於 tf.name_scope, 用來管理命名就好。


  • 本文來自 微信公眾號 datadw  【大資料探勘DT資料分析】


  • TensorFlow入門(八)tensorboard 的一個簡單示例 
    tensorboard 真的很好用,特別是在做比較複雜任務的時候,一方面你可以通過裡邊的graph檢查自己的網路結構寫對了沒有;另外一方面,通過觀察 loss 和 accuracy 的變化情況,輔助自己進行引數調優。

  • TensorFlow入門(九)使用 tf.train.Saver()儲存模型 
    這個例子介紹了怎麼儲存模型和重新匯入模型,像這樣的例子到處都有,但是有一點需要明白,就是:你要匯入某個變數的值,這個變數名稱,就是 tf.get_variable(‘nvar_ame’) 或者是 tf.Variable(name=’var_name’) 定義變數時的這個 scope name 和 name 一定要完全一致,否則會報錯。

  • TensorFlow入門(十)【遷移學習】往一個已經儲存好的模型新增新的變數並進行微調 
    在遷移學習中,通常我們已經訓練好一個模型,現在需要修改模型的部分結構,用於我們的新任務。比如: 
    在一個圖片分類任務中,我們使用別人訓練好的網路來提取特徵,但是我們的分類數目和原模型不同,這樣我們只能取到 fc 層,後面的分類層需要重新寫。這樣我們就需要新增新的變數。那麼這些新加入的變數必須得初始化才能使用。可是我們又不能使用 ‘tf.global_variables_initializer()’ 來初始化,否則原本訓練好的模型就沒用了。

  • Tensorflow入門(十一) 【模型聯合】如何利用tf.train.saver()把多個預訓練好的模型聯合起來fine-tune 
    實際上把多個模型聯合起來訓練這種方式用得並不多,就個人經驗來說,多個模型融合訓練並沒有單模型訓好以後再做融合效果好。但是但是,聯合的模型再加到模型融合中,還是會有提升的哈。那麼在進行模型聯合訓練的時候,有些細節就需要注意了。

  • Tensorflow入門(十二)使用 tfrecord 讀取資料 
    在 tf1.3 中,推出了 Dataset API,好像還挺好用的。但是因為TensorFlow一直沒更新,所以還沒嘗試。如果資料量比較大的話,我們就需要考慮一下資料讀取的問題了,而不是簡單粗暴的每次都把整個資料集匯入到記憶體中。從我的個人經驗來說,對於訓練資料,我會生成 tfrecord 檔案儲存,對於驗證集和測試集,我會使用 npz 檔案進行儲存。 


  • 對於訓練資料,使用 tfrecord 儲存的好處就是我們可以調整batch的大小,而且提供了非常便捷的shuffle功能。對於驗證集和測試集,一是不需要shuffle,而是我們完全可以根據網路大小固定batchsize。 
    在這個例子中,講了兩種資料生成 tfrecord 的方式:資料維度相同和資料維度不同兩種資料。前者比如固定大小的特徵矩陣,陣列,圖片等,比較簡單,可以使用 tf.train.Example() 進行打包;後者比如文字資料,每個序列的長度都是不固定的。可以使用 tf.train.SequenceExample() 進行打包。 
    後來我還是做了圖片的專案,不試不知道,圖片打包 tfrecord 也不是隨隨便便在網上找個例子就可以了。如果方法不正確的話,生成的 tfrecord 可能要大幾百倍,打包速度要慢上千倍,所以一定要選擇合適的方式。

  • Tensorflow入門(十三)最基礎的 seq2seq 機器翻譯模型 
    這個例子也是根據網友的例子改動了一下,原例子在 https://github.com/NELSONZHAO/zhihu/tree/master/basic_seq2seq 。 
    對於 seq2seq,很早之前就覺得非常有趣,然後也看了一些論文,瞭解一些細節,但是一直沒有程式碼實現,所以一些概念還是比較含糊。所以自己實現過一遍以後,很多細節的東西才瞭解了。另外,seq2seq 確實很有趣,但是模型實在是太大,特別是你想實現一個可用的翻譯模型之類的,顯示卡一定要充足。所以真正搞這個的,感覺都是有錢人。我的這個例子還有些資料處理的程式碼沒有放上去,所以跑不通,感興趣的可以看上面連線中網友的例子。等後期我整個專案完成了,再把整個程式碼開源。

其他資源

  • aymericdamien/TensorFlow-Examples 

  • https://github.com/aymericdamien/TensorFlow-Examples

  • 這個專案對於 TensorFlow 入門者來說真是非常非常好。


  • models/tutorials/ 

  • https://github.com/tensorflow/models/tree/master/tutorials

  • 這是官方提供的例子,包括 mnist, cifar10, ptb(講 LSTM), translate(講 seq2seq) 等。


  • models/research/slim/ 

  • https://github.com/tensorflow/models/tree/master/research/slim

  • 這是官方slim 的例子,裡邊提供了 ImageNet 的各個經典模型,而且提供訓練好的 ckpt 檔案,如果需要 fine-tune 的話可以直接用這個。


  • brightmart/text_classification 

  • https://github.com/brightmart/text_classification

  • 這裡提供了很多文字分類的模型。


  • tensorflow/nmt 

  • https://github.com/tensorflow/nmt

  • 這裡提供了比較全的 機器翻譯的模型。


人工智慧大資料與深度學習

搜尋新增微信公眾號:weic2c

640?wx_fmt=png

長按圖片,識別二維碼,點關注



大資料探勘DT資料分析

搜尋新增微信公眾號:datadw


教你機器學習,教你資料探勘

640?wx_fmt=jpeg

長按圖片,識別二維碼,點關注


相關文章