【資料推薦】TensorFlow的入門資料整理與技巧

TensorFlow的入門資料整理與技巧

我與TensorFlow的故事

最早知道TensorFlow是在我的本科實驗室,他是Google Developer Group的全國基地之一,也是他們首先告訴了我人工智能的概念。於是我在大二,也就是2017年末開始學習TensorFlow,用自己的所有獎學金買了一塊1080Ti構成的服務器,配置了一整天的cuda和cudnn,最後在自己的機器上運行起了深度學習的Hello World(手寫數字識別),同時也有了第一個收藏的csdn文章:Win10 TensorFlow(gpu)安裝詳解。

不久,在自己的第一個用CNN的項目中從詞向量訓練、numpy讀取、placeholder、loss函數的編寫,我大概寫了一個月的時間,現在想想真是效率低的可怕,不知道下一行代碼該寫什麼,不知道bug究竟是啥意思。走了不少的彎路,纔算是入門了TensorFlow

我希望解決的問題是:“如何快速且正確地使用TensorFlow上按自己想法實現深度學習模型“

在這一大背景下,我試圖結合自己的一些粗淺的經歷,來分析一下可能的問題以及應對的方法,希望對大家入門TensorFlow有所幫助,主要有3個方面:

  1. 理論知識欠缺(對於模型的概念和細節不熟悉)

  2. 編程技巧欠缺(不知道如何模塊化的編寫程序和流程)

  3. 對於TensorFlow及其依賴框架的不熟悉

針對以上三個問題,全文貫徹一個思想:從需求出發。我想可以逐一出發,各個擊破。

1. 理論知識

理論作爲深度學習時代必不可少的基礎,如果要實現一些例如循環神經網絡,卷積神經網絡,Transformer模塊等等,概念的掌握是非常必要的。大家需要理解神經網絡的本質就是一個輸入輸出的函數。對於一個神經網絡,我們給定輸入,等待他的輸出就好了。這裏給大家推薦一些入門的視頻和書籍,可以有效的幫助大家理解概念。

1.1 視頻

  1. 吳恩達的深度學習視頻,可以在coursera上學習deep learningmachine learning, 這是全網幾乎最公認最基礎的深度學習入門課程了,需要的數學也非常非常的簡單,就是基礎的矩陣運算和微積分。現在還搭配DeepLearning.AI TensorFlow Developer課程,看評價也很贊!
  2. 深度學習之父,圖靈獎作者Hinton的課程csc321 Neural Networks for Machine Learning,多倫多大學的神經網絡機器學習課程,早期是由Hinton本人上課,需要有一定的基礎。
  3. 斯坦福大學教授Chris Manning 的課程CS224n: Natural Language Processing with Deep Learning,專注於自然語言處理(夾帶私貨,hhhh)
  4. TensorFlow實用課程:《TensorFlow 入門實操課程》

1.2 書籍

  1. 《深度學習》by Ian Goodfellow, Yoshua Bengio, Aaron Courville
  2. 《機器學習》 by 周志華
  3. 《統計學系方法(第二版)》by 李航

此處不再過多推薦,基礎在於牢固,概念在於理解,按需求去學習就好,感興趣可以去看曾經整理的文章:

  1. 2019 年最佳機器學習和深度學習書籍的名單

  2. 15套免費的自然語言處理NLP課程及經典教材分享!

  3. 機器學習|深度學習|自然語言處理 學習數據/課程/資料/資源大分享

以及TensorFlow官方的整理合集:

  1. TensorFlow官網教育資源

大家注意一定要學練結合,不要試圖把知識全部喫透理解了再去着手去寫代碼,投入產出比並不高,得不償失。

2. 編程思維和技巧

編程是實現TensorFlow的重中之重,大家如果想實現一個TensorFlow模型,毫無疑問要涉及到

  1. 數據讀取
  2. 訓練
  3. 測試
  4. 模型的讀取和存儲

那麼此時如何整理項目,如何編寫一個合理、模塊化的程序是非常有必要的,這能讓程序錯誤更少,方便版本升級以及。還是一個原則:以可讀性爲前提,按需求出發

如果程序某個模塊異常的複雜,比如訓練模型有非常多個方式,訓練的過程也比較複雜,需要過幾步做一次測試,測試要做什麼準備。那麼這時候,將train寫成一個函數甚至是一個類,都是非常合理的。例如huggingface庫就有Trainer,擁有不同的訓練超參數方便應對不同情況的訓練。

2. 1. 如何培養

  1. 掌握類Class,實例Instance等概念

  2. 多閱讀github的項目文獻開源的入門資料庫中會有代碼和運行過程,思考他們的設計思路,私以爲有如下的幾個級別:

    • 非常基礎的入門資料,只有模型一個類,以jupyter notebook爲存儲格式,從頭運行到尾。甚至函數也沒幾個
    • 入門資料,編寫了模型類,訓練函數,測試函數的jupyter notebook文件
    • 入門項目,將模型和數據讀取等等分成了不同的.py文件進行處理
    • 複雜項目,有非常細分的包和.py文件,對應了也許遠程服務器展示,模型部署以及測試等等。
  3. 自己編寫入門項目,按照曾經思考和運行的程序進行改寫

這裏沒有說級別有高低之分,一切都是需求出發,面向的人羣和受衆面不同,因此存儲的格式不一樣,大家還是按照自己的需求去看和學習。

2.2. 一些技巧

  1. 變量和函數命名技巧,強烈推薦大家應該讀一讀的書
    代碼整潔之道
    ,這本書我在大二讀了前3個章節,代碼質量就上升了好幾個檔次,給大家一些書中想法(自己還記得的,應該已經不是原文表述了):

    • 變量名稱要能恰當的表達他的意義。比如一個int是左邊界,我會寫成left_boundary而不是lb
    • 函數應該只有最小運行過程,如果函數明中出現了and,大部分情況可以分成兩個函數。
    • 函數的參數應該控制在較少的數量範圍內,一個函數的參數如果太多,可以考慮把一些參數設計成一個類
  2. 使用python編寫規範

    • 比如可以嘗試這樣:
    from typing import Dict, List, Tuple, Optional
    from dataclasses import dataclass
    @dataclass
    class InputFeatures:
        input_ids: List[int]
        attention_mask: Optional[List[int]] = None
        token_type_ids: Optional[List[int]] = None
    
    def example_func(example_arg_a:str, example_arg_b: Dict = None) -> Tuple:
        """
        This is an example function for instruction
        :param example_arg_a: example argument a
        :param example_arg_b: example argument b
        :return: a data shoule be tuple type.
        """
        return (1,2)
    
    • InputFeatures類中使用dataclass可以加快一個class的編寫,加入typing的類型限制,可以幫助數據類型的設置,代碼更易讀懂,也節省了空間。
    • 如果class還有一些語法糖的意味在裏面,那麼函數example_func完全是一種費時費力的做法,
      • 首先在函數類型中確定了輸入參數應有的類型,也描述了函數應該返回的類型 類型的限制結合一些IDE可以有效的幫助我們減少錯誤,因爲py文件在錯誤的地方會有異常的色塊,幫助我們去檢查錯誤。
      • 函數的描寫中加入了詳細的文檔。可以有效的幫助讀者瞭解這個函數的功能。是否文檔是一定必要的呢?也並非如此,還是一句話,按需求,如果函數非常複雜,需要好好描述一下,那麼可以加入。反之則不必。

3. TensorFlow及相關框架

TensorFlow與非常多庫都有着關聯和依賴,例如:numpy庫、scipy庫、Tensorboard庫等等。

這裏我建議大家強烈學習Numpy庫,因爲Numpy和TensorFlow對於數據的處理有着強烈的依賴關係,而且可以簡單互相轉換。理解Numpy對矩陣的處理和運行,對於理解TensorFlow也是非常有幫助的。

這裏大家還是按需出發,需要對矩陣進行什麼操作就去學什麼,問問搜索引擎。

我唯一自己學習過的Numpy基礎就是唐宇迪老師的基礎入門了,還是挺不錯的。我覺得在github的開源也能學的很好,唯一的技巧就是多嘗試,多測試,多寫,多想

3.1 官方文檔

這裏推薦大家多查詢官方文檔,這是你真正唯一絕對正確的資料,如果有着不錯的編程基礎,完全可以通過文檔中的樣例來進行入門。

  1. TensorFlow
  2. Numpy
  3. HuggingFace
  4. TensorFlow入門教程

4. 雜項

入門TensorFlow難免遇到非常多的問題以及困難,希望大家多思考,多嘗試。這裏給大家推薦一些我自己貫徹的原則和技巧,希望對大家有幫助。

  1. 提問的智慧-鳥哥 非常非常重要,可以幫助你們快速獲取答案,同時一些思想可以應用到日常交流當中。

  2. 嘗試去查找stackoverflow、專門的社區例如TensorFlow官方社區, 官方文檔上的答案

  3. 日常關注技術動態,從點滴處進步:

    ● TensorFlow 官方微信公衆號(TensorFlow_official):瞭解 TensorFlow 核心基礎,獲取最新的產品資訊和應用案例

    加入 TFUG:在開源社區中找到更多志同道合的夥伴,在社區活動中獲得提升

    知乎(谷歌開發者):分享實用技術資源

    Bilibili TensorFlow 官方頻道:聚集官方入門視頻教程和各個行業案例

  4. 掌握多少儘量按照需求來,比如儘管算法實現的效率低了一點點,也不是最簡潔的寫法。但如果當前階段只要正確實現,那麼效率就並非是最需要讓人擔心的。在下一階段如果效率需要是一個嚴重指標,那麼再進一步優化特定模塊。這樣可以保證最小可使用產品原則。在保證正確的基礎上,一步一步向前迭代。

  5. 保持謙遜、持續學習

最後

感謝TensorFlow社區的邀請,我做了一些粗略的總結,希望社區能夠共同進步,我們都能在社區中汲取到知識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章