- 從零開始學(xué)TensorFlow2.0
- 趙銘 歐鐵軍編著
- 916字
- 2020-09-25 12:47:42
3.4 自定義層
機器學(xué)習(xí)模型通常可以表示為簡單網(wǎng)絡(luò)層的堆疊與組合,TensorFlow提供了常見的網(wǎng)絡(luò)層,TensorFlow 2.0推薦使用tf.keras來構(gòu)建網(wǎng)絡(luò)層,以提高可讀性和易用性。
3.4.1 網(wǎng)絡(luò)層的常見操作
TensorFlow 2.0推薦將tf.keras作為構(gòu)建神經(jīng)網(wǎng)絡(luò)的高級API。本節(jié)對常見的網(wǎng)絡(luò)層操作進行介紹。
(1)構(gòu)建一個簡單的全連接網(wǎng)絡(luò),代碼如下。

(2)代碼的運行結(jié)果如下,包含權(quán)重和偏置信息。

(3)tf.keras非常靈活,還可以分別取出上例中的權(quán)重和偏置,代碼如下。

(4)代碼的運行結(jié)果如下。

3.4.2 自定義網(wǎng)絡(luò)層
在實際中,經(jīng)常需要擴展tf.keras.Layer類并自定義網(wǎng)絡(luò)層。本節(jié)介紹如何自定義網(wǎng)絡(luò)層。
(1)在自定義網(wǎng)絡(luò)層的過程中主要使用3個函數(shù),示例代碼如下。

說明:調(diào)用build()函數(shù)構(gòu)建網(wǎng)絡(luò)并不是必要的,有時可以在__init__()中構(gòu)建網(wǎng)絡(luò)。但是,調(diào)用build()函數(shù)構(gòu)建網(wǎng)絡(luò)的優(yōu)點是可以動態(tài)獲取輸入數(shù)據(jù)的shape,大大提高了運行效率。
(2)上述代碼的運行結(jié)果如下。


3.4.3 網(wǎng)絡(luò)層組合
有很多機器學(xué)習(xí)模型是不同網(wǎng)絡(luò)層的組合,網(wǎng)絡(luò)層組合學(xué)習(xí)是加快學(xué)習(xí)速度和精度的重要方法。
(1)使用下面的代碼在TensorFlow 2.0中構(gòu)建一個包含多個網(wǎng)絡(luò)層的模型。


說明:該例子是resnet的一個殘差塊,是“卷積+批標準化+殘差連接”的組合。
(2)代碼的運行結(jié)果如下。

(3)有時需要構(gòu)建線性模型,可以直接用tf.keras.Sequential來構(gòu)建,示例代碼如下。

(4)代碼的運行結(jié)果如下。

3.4.4 自動求導(dǎo)
TensorFlow使用的求導(dǎo)方法被稱為自動微分,它既不是符號求導(dǎo)也不是數(shù)值求導(dǎo),而是兩者的結(jié)合。
(1)TensorFlow 2.0利用tf.GradientTape API來實現(xiàn)自動求導(dǎo)功能,在tf.GradientTape()上下文中執(zhí)行的操作都會被記錄在“tape”中,然后TensorFlow 2.0使用反向自動微分來計算相關(guān)操作的梯度,示例代碼如下。

(2)代碼的運行結(jié)果如下。

(3)輸出中間變量的導(dǎo)數(shù),代碼如下。

(4)代碼的運行結(jié)果如下。

(5)在默認情況下,GradientTape的資源會在執(zhí)行tf.GradientTape()后釋放。如果希望多次計算梯度,需要創(chuàng)建一個持久的GradientTape。代碼如下。


(6)代碼的運行結(jié)果如下。

(7)因為tape記錄了整個操作,所以即使存在Python控制流(如if和while),也能正常處理梯度求導(dǎo),示例代碼如下。

(8)代碼的運行結(jié)果如下。

(9)GradientTape上下文管理器在計算梯度時會保持梯度。因此,GradientTape也可以實現(xiàn)高階梯度計算,示例代碼如下。


(10)代碼的運行結(jié)果如下。

本章介紹了一些TensorFlow 2.0的基本概念并舉例進行了說明,后面在使用到這些概念時,會舉例對具體的使用方法進行介紹。
- 嵌入式實時操作系統(tǒng)原理與最佳實踐
- 現(xiàn)代嵌入式系統(tǒng)開發(fā)專案實務(wù)
- 嵌入式虛擬化技術(shù)與應(yīng)用:ACRN開源項目實踐
- 嵌入式系統(tǒng)Linux內(nèi)核開發(fā)實戰(zhàn)指南(ARM平臺)
- 基于STM32的嵌入式系統(tǒng)設(shè)計與實踐
- 嵌入式Linux與物聯(lián)網(wǎng)軟件開發(fā):ARM處理器開發(fā)自學(xué)教程
- 單片機原理與接口技術(shù)
- 單片微型計算機原理及應(yīng)用
- 單片機應(yīng)用技術(shù)實訓(xùn)指導(dǎo)
- STM32W無線射頻Zigbee單片機原理與應(yīng)用
- 單片機開發(fā)從入門到實踐
- 嵌入式系統(tǒng):基于項目的分析和設(shè)計
- 深度學(xué)習(xí)實踐教程
- AVR單片機很簡單:C語言快速入門及開發(fā)實例
- 基于Quartus II的FPGA/CPLD設(shè)計實例精解