【小白学PyTorch】18.TF2构建自定义模型
【機器學習煉丹術】的學習筆記分享
<<小白學PyTorch>>
擴展之Tensorflow2.0?| 17 TFrec文件的創建與讀取
擴展之Tensorflow2.0?| 16 TF2讀取圖片的方法
擴展之Tensorflow2.0?| 15 TF2實現一個簡單的服裝分類任務
小白學PyTorch | 14 tensorboardX可視化教程
小白學PyTorch | 13 EfficientNet詳解及PyTorch實現
小白學PyTorch | 12 SENet詳解及PyTorch實現
小白學PyTorch | 11 MobileNet詳解及PyTorch實現
小白學PyTorch | 10 pytorch常見運算詳解
小白學PyTorch | 9 tensor數據結構與存儲結構
小白學PyTorch | 8 實戰之MNIST小試牛刀
小白學PyTorch | 7 最新版本torchvision.transforms常用API翻譯與講解
小白學PyTorch | 6 模型的構建訪問遍歷存儲(附代碼)
小白學PyTorch | 5 torchvision預訓練模型與數據集全覽
小白學PyTorch | 4 構建模型三要素與權重初始化
小白學PyTorch | 3 淺談Dataset和Dataloader
小白學PyTorch | 2 淺談訓練集驗證集和測試集
小白學PyTorch | 1 搭建一個超簡單的網絡
小白學PyTorch | 動態圖與靜態圖的淺顯理解
參考目錄:
1 創建自定義網絡層
2 創建一個完整的CNN
2.1 keras.Model vs keras.layers.Layer
之前講過了如何用tensorflow構建數據集,然后這一節課講解如何用Tensorflow2.0來創建模型。
TF2.0中創建模型的API基本上都放到了它的Keras中了,Keras可以理解為TF的高級API,里面封裝了很多的常見網絡層、常見損失函數等。后續會詳細介紹keras的全面功能,本篇文章講解如何構建模型。
1 創建自定義網絡層
import?tensorflow?as?tf import?tensorflow.keras?as?kerasclass?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.biasx?=?tf.ones((3,5)) my_layer?=?MyLayer(input_dim=5,output_dim=10) out?=?my_layer(x) print(out.shape) >>>?(3,?10)這個就是定義了一個TF的網絡層,其實可以看出來和PyTorch定義的方式非常的類似:
這個類要繼承tf.keras.layers.Layer,這個pytorch中要繼承torch.nn.Module類似;
網絡層的組件在__def__中定義,和pytorch的模型類相同;
call()和pytorch中的forward()的類似。
上面代碼中實現的是一個全連接層的定義,其中可以看到使用tf.random_normal_initializer()來作為參數的初始化器,然后用tf.Variable來產生網絡層中的權重變量,通過trainable=True這個參數說明這個權重變量是一個參與梯度下降的可以訓練的變量。
我通過tf.ones((3,5))產生一個shape為[3,5]的一個全是1的張量,這里面第一維度的3表示有3個樣本,第二維度的5就是表示要放入全連接層的數據(全連接層的輸入是5個神經元);然后設置的全連接層的輸出神經元數量是10,所以最后的輸出是(3,10)。
2 創建一個完整的CNN
import?tensorflow?as?tf import?tensorflow.keras?as?kerasclass?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?inputsclass?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?inputsmodel?=?MyNet(3) data?=?tf.random.normal((16,224,224,3)) output?=?model(data) print(output.shape) >>>?(16,?56,?56,?32)這個是構建了一個非常簡單的卷積網絡,結構是常見的:卷積層+BN層+ReLU層。可以發現這里繼承的一個tf.keras.Model這個類。
2.1 keras.Model vs keras.layers.Layer
Model比Layer的功能更多,反過來說,Layer的功能更精簡專一。
Layer:僅僅用作張量的操作,輸入一個張量,輸出也要求是一個張量,對張量的操作都可以用Layer來封裝;
Model:一個更加復雜的結構,由多個Layer組成。 Model的話,可以使用.fit(),.evaluate(),.predict()等方法來快速訓練。保存和加載模型也是在Model這個級別進行的。
現在說一說上面的代碼和pytorch中的區別,作為一個對比學習、也作為一個對pytorch的回顧:
卷積層Conv2D中,Keras中不用輸入輸入的通道數,filters就是卷積后的輸出特征圖的通道數;而PyTorch的卷積層是需要輸入兩個通道數的參數,一個是輸入特征圖的通道數,一個是輸出特征圖的通道數;
keras.layers.BatchNormalization(axis=3)是BN層,這里的axis=3說明第三個維度(從0開始計數)是通道數,是需要作為批歸一化的維度(這個了解BN算法的朋友應該可以理解吧,不了解的話去重新看我之前剖析BN層算法的那個文章吧,在文章末尾有相關鏈接)。pytorch的圖像的四個維度是:
【樣本數量,通道數,,】
而tensorflow是:
【樣本數量,,,通道數】
總之,學了pytorch之后,再看keras的話,對照的keras的API,很多東西都直接就會了,兩者的API越來越相似了。
上面最后輸出是(16, 56, 56, 32),輸入的是的維度,然后經過兩個最大池化層,就變成了了。
到此為止,我們現在應該是可以用keras來構建模型了。
- END -往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/662nyZF本站qq群704220115。加入微信群請掃碼進群(如果是博士或者準備讀博士請說明):總結
以上是生活随笔為你收集整理的【小白学PyTorch】18.TF2构建自定义模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Github标星86.4K+:常见数据结
- 下一篇: 【数据竞赛】Kaggle竞赛宝典国内外竞