1
本節簡述
對于開展深度學習開發的目標而言,我們需要掌握的除了必要的深度學習理論基礎、必要的開發依賴庫基礎知識、基本的開發套路之外,我們還需要掌握它常見的外圍小幫手都有哪些。這些小幫手就是深度學習依賴庫中的其他并不是核心的模塊,但卻能有效幫助我們提升開發的效率,提升學習模型的質量等。因此,從這一節開始,我們將逐步開始分享一些TensorFlow庫中的模塊知識,期待著這些模塊的基本知識分享結束之后,我們能夠寫出更高效的DL程序,提升我們的DL能力。常用到的模塊除了前面我們提到過的tf.keras模塊、tf.data模塊、tensorflow_datasets庫、tf.math等模塊之外,我們還會比較多的用到以下這些模塊:1、保存模型訓練過程中的各種參數,主要是各個神經網絡層中的神經元中的權重系數與偏置值等,這樣做的好處是:當我們下一次需要用到這個模型時,就可以不必再訓練一次,直接導出被保存好的模型訓練參數值即可使得該模型被用于開展預測工作。注意,這里只是保存模型的訓練參數,并不將整個模型進行保存。通常我們使用一個名叫:tf.train.checkpoint的模塊來幫我們做到這一點;2、我們都知道TensorFlow庫在幫我們訓練學習模型時,期間的訓練過程,我們不需要過多關心。因此也看不到它們內部究竟是怎么訓練的,各個參數之間又是如何發生的變化。但人類總是充滿好奇心,我們如果想要目睹訓練過程中的各個參數的變化,那么我們就需要使用一個名叫:TensorBoard的庫來幫我們實現訓練參數變化的可視化展示,不過該庫僅僅是一個外圍工具,真正用于記錄訓練參數變化狀態的還是一個叫:tf.summary的模塊;3、在深度學習算法模型訓練前,我們需要加載相關的數據集。這是我們開展訓練的前提。因此,在這一步,我們也有一些優化文章可以做,比如把數據集變個樣子,使得學習模型加載起來更高效一些。這就是在TensorFlow庫中所提供的一個名叫tf.Example的模塊;4、在TensorFlow2.0版本中,所有的代碼都運行在即時執行模式下,這是很靈活,且調試也很方便的。但有時我們為了能更方便部署學習模型或者追求更高的模型性能,也需要把運行模式從即時執行模型切換到圖模式下執行,此時就需要用到一個叫tf.function的模塊,這我們在之前也見到過,后面將會就此展開更深入的探討;5、深度學習之所以廣受歡迎,是因為它幾乎能將觸角伸及日常生產生活的每個角落。比如我們需要處理一段時間內的流量廣告相關的問題,由于涉及到時間因素,屬于一種設計時間序列的問題,這時我們可能就需要用到一種能處理時間序列的數據結構,這在TensorFlow庫中有一個專門的模塊,叫tf.TensorArray,也稱之為動態數組。它能夠專門用于這種帶有時間數據的問題;6、GPU的配置問題。前面的分享中我們也大致提過,當前的TensorFlow支持三種處理器下的運算:CPU、GPU以及TPU。TPU是專門的張量運算處理器,是谷歌搞的,目前最為高大上,我們這里暫且不說它。GPU我們大家不會太陌生:圖形處理器。只要我們的電腦中有英偉達的處理器,那你在電腦上安裝好的TensorFlow就可以基于GPU開展計算,這樣可比純粹地靠CPU來運行TensorFlow程序要高效快速得多。但是問題在于:1)、CPU、GPU共存時,TensorFlow默認會基于GPU開展運算,可如果我們非要在CPU下計算呢?有啥辦法在代碼中進行指定嗎?2)、如果我們是個小土豪,電腦中配置好好幾塊的GPU,那么我們在TensorFlow程序中可不可以手動指定利用哪個GPU來開展運算?3)、GPU的內存是有限的,如果全部TensorFlow程序占有了,那未免有點利用率低下的不足,可不可以對此也做一些限制?以上的問題都可以交給一個叫:tf.Config的模塊來幫我們搞定。7、有關tf.data模塊中的Dataset模塊,我們還有一些API尚未被提及,這里也要稍微聊一聊它們,畢竟它們的存在也有助于提升我們編寫高效的TensorFlow程序出來,還有助于提升模型訓練效率;8、模型的保存與加載。這里的模型保存就不再只是像使用tf.Checkpoing模塊那樣的保存一些訓練過程的參數了,而是要把所有與模型相關的全部數據都保存起來,包括它的參數配置、運行模式、模型內部的網絡結構等等。當我們下一次需要再用到該模型時,只需要簡單地對其做一個加載,就可以直接用來做預測,不像tf.Checkpoint模塊的加載,只是加載了一些參數,并不見得就能立即用來預測數據,往往還需要進行過一定時間的模型訓練。以上八個方面所代表的一些常用模塊基本上就構成了我們開發出一個高質量的TensorFlow程序的主要外圍模塊集。當然,這只是針對多數情況而言。其他場合下,我們可能還需要用到一些其他的模塊,屆時,我們在講述具體的神經網絡算法模型的具體實踐案例時,可能還會碰到一些在這里并未提及過的模塊與API,到那時,我們也會一一作出詳解。2
小結
這一節的知識僅僅做一個框架性地敘述,大體梳理一下我們在圍繞如何開發出高效的TensorFlow程序而展開的一些外圍模塊的概要介紹。接下來,我們將依次介紹這八個方面需要用到的相關模塊及模塊內常用的API,并盡可能舉出一定的使用案例來加強我們對這些知識的理解。需要再次強調一點的是:不論是我們說Python的模塊還是說爬蟲的模塊還是說TensorFlow等Python庫的模塊,其實這些模塊最終的實現形式都是一個個的類。猶如一個大容器一樣,里邊包含了相關的屬性(也稱之為私有變量)以及如何操作這些屬性的方法——稱之為API。因此,如果在這里大家還對模塊這個詞匯有些不理解,不妨按照上面的解釋來領會模塊的意思。或者你還可以這么打個比方:模塊就好比一個廚房,那么廚房里必然有一些私有的屬性:比如、刀具、案板、灶具、碗筷等等基礎的東西。同時,這個廚房還必須要為我們提供一些干活的方法:比如切菜就是一個方法,炒菜又是一個方法,端菜也是一個方法。只不過這些方法有些僅局限在廚房內部,稱之為私有方法。對客廳啊、臥室之類的范圍是不可見,也沒必要見的。有些則是公有方法,是需要在廚房與其他空間之間開展聯系用的,比如把菜從廚房端到餐廳這個方法就是一個公有方法;而切菜、炒菜則是一個私有方法。只不過在程序的世界里,對私有方法、私有變量、公有方法等都做了一些使用上的嚴格限制:私有的東西一律只能在類的內部被調用,不可被類的外部使用者操縱,否則就是犯法了。公有方法就是外部與類唯一的交流渠道。這一點就與我們現實中的要求有些不同。好了,以上就是這一節的簡要知識介紹,謝謝大家。