官术网_书友最值得收藏!

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的基本概念并舉例進行了說明,后面在使用到這些概念時,會舉例對具體的使用方法進行介紹。

主站蜘蛛池模板: 宁晋县| 吉安县| 大足县| 同江市| 大埔区| 中江县| 夏邑县| 许昌县| 金乡县| 彭州市| 大埔县| 宝山区| 耿马| 普格县| 阳山县| 稷山县| 九龙坡区| 枣阳市| 九江市| 武安市| 东莞市| 横山县| 湖北省| 通渭县| 三台县| 织金县| 永和县| 颍上县| 德格县| 喀喇沁旗| 澄迈县| 汉沽区| 棋牌| 化德县| 五台县| 和龙市| 四川省| 汝城县| 昭苏县| 广汉市| 微山县|