【小白學PyTorch】18.TF2構(gòu)建自定義模型
擴展之Tensorflow2.0?| 17 TFrec文件的創(chuàng)建與讀取
擴展之Tensorflow2.0?| 16 TF2讀取圖片的方法
擴展之Tensorflow2.0?| 15 TF2實現(xiàn)一個簡單的服裝分類任務(wù)
小白學PyTorch | 14 tensorboardX可視化教程
小白學PyTorch | 13 EfficientNet詳解及PyTorch實現(xiàn)
小白學PyTorch | 12 SENet詳解及PyTorch實現(xiàn)
小白學PyTorch | 11 MobileNet詳解及PyTorch實現(xiàn)
小白學PyTorch | 9 tensor數(shù)據(jù)結(jié)構(gòu)與存儲結(jié)構(gòu)
小白學PyTorch | 8 實戰(zhàn)之MNIST小試牛刀
小白學PyTorch | 7 最新版本torchvision.transforms常用API翻譯與講解
小白學PyTorch | 6 模型的構(gòu)建訪問遍歷存儲(附代碼)
小白學PyTorch | 5 torchvision預(yù)訓練模型與數(shù)據(jù)集全覽
小白學PyTorch | 4 構(gòu)建模型三要素與權(quán)重初始化
小白學PyTorch | 3 淺談Dataset和Dataloader
小白學PyTorch | 1 搭建一個超簡單的網(wǎng)絡(luò)
小白學PyTorch | 動態(tài)圖與靜態(tài)圖的淺顯理解
參考目錄:
1 創(chuàng)建自定義網(wǎng)絡(luò)層
2 創(chuàng)建一個完整的CNN
2.1 keras.Model vs keras.layers.Layer
之前講過了如何用tensorflow構(gòu)建數(shù)據(jù)集,然后這一節(jié)課講解如何用Tensorflow2.0來創(chuàng)建模型。
TF2.0中創(chuàng)建模型的API基本上都放到了它的Keras中了,Keras可以理解為TF的高級API,里面封裝了很多的常見網(wǎng)絡(luò)層、常見損失函數(shù)等。后續(xù)會詳細介紹keras的全面功能,本篇文章講解如何構(gòu)建模型。
1 創(chuàng)建自定義網(wǎng)絡(luò)層
import?tensorflow?as?tf
import?tensorflow.keras?as?keras
class?MyLayer(keras.layers.Layer):
????def?__init__(self,?input_dim=32,?output_dim=32):
????????super(MyLayer,?self).__init__()
????????w_init?=?tf.random_normal_initializer()
????????self.weight?=?tf.Variable(
????????????initial_value=w_init(shape=(input_dim,?output_dim),?dtype=tf.float32),
????????????trainable=True)?#?如果是false則是不參與梯度下降的變量
????????b_init?=?tf.zeros_initializer()
????????self.bias?=?tf.Variable(initial_value=b_init(
????????????shape=(output_dim),?dtype=tf.float32),?trainable=True)
????def?call(self,?inputs):
????????return?tf.matmul(inputs,?self.weight)?+?self.bias
x?=?tf.ones((3,5))
my_layer?=?MyLayer(input_dim=5,
???????????????????output_dim=10)
out?=?my_layer(x)
print(out.shape)
>>>?(3,?10)
這個就是定義了一個TF的網(wǎng)絡(luò)層,其實可以看出來和PyTorch定義的方式非常的類似:
這個類要繼承 tf.keras.layers.Layer,這個pytorch中要繼承torch.nn.Module類似;網(wǎng)絡(luò)層的組件在 __def__中定義,和pytorch的模型類相同;call()和pytorch中的forward()的類似。
上面代碼中實現(xiàn)的是一個全連接層的定義,其中可以看到使用tf.random_normal_initializer()來作為參數(shù)的初始化器,然后用tf.Variable來產(chǎn)生網(wǎng)絡(luò)層中的權(quán)重變量,通過trainable=True這個參數(shù)說明這個權(quán)重變量是一個參與梯度下降的可以訓練的變量。
我通過tf.ones((3,5))產(chǎn)生一個shape為[3,5]的一個全是1的張量,這里面第一維度的3表示有3個樣本,第二維度的5就是表示要放入全連接層的數(shù)據(jù)(全連接層的輸入是5個神經(jīng)元);然后設(shè)置的全連接層的輸出神經(jīng)元數(shù)量是10,所以最后的輸出是(3,10)。
2 創(chuàng)建一個完整的CNN
import?tensorflow?as?tf
import?tensorflow.keras?as?keras
class?CBR(keras.layers.Layer):
????def?__init__(self,output_dim):
????????super(CBR,self).__init__()
????????self.conv?=?keras.layers.Conv2D(filters=output_dim,?kernel_size=4,?padding='same',?strides=1)
????????self.bn?=?keras.layers.BatchNormalization(axis=3)
????????self.ReLU?=?keras.layers.ReLU()
????def?call(self,?inputs):
????????inputs?=?self.conv(inputs)
????????inputs?=?self.ReLU(self.bn(inputs))
????????return?inputs
class?MyNet(keras.Model):
????def?__init__?(self,input_dim=3):
????????super(MyNet,self).__init__()
????????self.cbr1?=?CBR(16)
????????self.maxpool1?=?keras.layers.MaxPool2D(pool_size=(2,2))
????????self.cbr2?=?CBR(32)
????????self.maxpool2?=?keras.layers.MaxPool2D(pool_size=(2,2))
????def?call(self,?inputs):
????????inputs?=?self.maxpool1(self.cbr1(inputs))
????????inputs?=?self.maxpool2(self.cbr2(inputs))
????????return?inputs
model?=?MyNet(3)
data?=?tf.random.normal((16,224,224,3))
output?=?model(data)
print(output.shape)
>>>?(16,?56,?56,?32)
這個是構(gòu)建了一個非常簡單的卷積網(wǎng)絡(luò),結(jié)構(gòu)是常見的:卷積層+BN層+ReLU層。可以發(fā)現(xiàn)這里繼承的一個tf.keras.Model這個類。
2.1 keras.Model vs keras.layers.Layer
Model比Layer的功能更多,反過來說,Layer的功能更精簡專一。
Layer:僅僅用作張量的操作,輸入一個張量,輸出也要求是一個張量,對張量的操作都可以用Layer來封裝; Model:一個更加復(fù)雜的結(jié)構(gòu),由多個Layer組成。 Model的話,可以使用 .fit(),.evaluate(),.predict()等方法來快速訓練。保存和加載模型也是在Model這個級別進行的。
現(xiàn)在說一說上面的代碼和pytorch中的區(qū)別,作為一個對比學習、也作為一個對pytorch的回顧:
卷積層Conv2D中,Keras中不用輸入輸入的通道數(shù), filters就是卷積后的輸出特征圖的通道數(shù);而PyTorch的卷積層是需要輸入兩個通道數(shù)的參數(shù),一個是輸入特征圖的通道數(shù),一個是輸出特征圖的通道數(shù);keras.layers.BatchNormalization(axis=3)是BN層,這里的axis=3說明第三個維度(從0開始計數(shù))是通道數(shù),是需要作為批歸一化的維度(這個了解BN算法的朋友應(yīng)該可以理解吧,不了解的話去重新看我之前剖析BN層算法的那個文章吧,在文章末尾有相關(guān)鏈接)。pytorch的圖像的四個維度是:
而tensorflow是:
總之,學了pytorch之后,再看keras的話,對照的keras的API,很多東西都直接就會了,兩者的API越來越相似了。
上面最后輸出是(16, 56, 56, 32),輸入的是的維度,然后經(jīng)過兩個最大池化層,就變成了了。
到此為止,我們現(xiàn)在應(yīng)該是可以用keras來構(gòu)建模型了。
- END -往期精彩回顧
獲取一折本站知識星球優(yōu)惠券,復(fù)制鏈接直接打開:
https://t.zsxq.com/662nyZF
本站qq群704220115。
加入微信群請掃碼進群(如果是博士或者準備讀博士請說明):
