【小白学PyTorch】18.TF2构建自定义模型
【機(jī)器學(xué)習(xí)煉丹術(shù)】的學(xué)習(xí)筆記分享
<<小白學(xué)PyTorch>>
擴(kuò)展之Tensorflow2.0?| 17 TFrec文件的創(chuàng)建與讀取
擴(kuò)展之Tensorflow2.0?| 16 TF2讀取圖片的方法
擴(kuò)展之Tensorflow2.0?| 15 TF2實現(xiàn)一個簡單的服裝分類任務(wù)
小白學(xué)PyTorch | 14 tensorboardX可視化教程
小白學(xué)PyTorch | 13 EfficientNet詳解及PyTorch實現(xiàn)
小白學(xué)PyTorch | 12 SENet詳解及PyTorch實現(xiàn)
小白學(xué)PyTorch | 11 MobileNet詳解及PyTorch實現(xiàn)
小白學(xué)PyTorch | 10 pytorch常見運算詳解
小白學(xué)PyTorch | 9 tensor數(shù)據(jù)結(jié)構(gòu)與存儲結(jié)構(gòu)
小白學(xué)PyTorch | 8 實戰(zhàn)之MNIST小試牛刀
小白學(xué)PyTorch | 7 最新版本torchvision.transforms常用API翻譯與講解
小白學(xué)PyTorch | 6 模型的構(gòu)建訪問遍歷存儲(附代碼)
小白學(xué)PyTorch | 5 torchvision預(yù)訓(xùn)練模型與數(shù)據(jù)集全覽
小白學(xué)PyTorch | 4 構(gòu)建模型三要素與權(quán)重初始化
小白學(xué)PyTorch | 3 淺談Dataset和Dataloader
小白學(xué)PyTorch | 2 淺談訓(xùn)練集驗證集和測試集
小白學(xué)PyTorch | 1 搭建一個超簡單的網(wǎng)絡(luò)
小白學(xué)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ù)會詳細(xì)介紹keras的全面功能,本篇文章講解如何構(gòu)建模型。
1 創(chuàng)建自定義網(wǎng)絡(luò)層
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的網(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)重變量是一個參與梯度下降的可以訓(xù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?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)這個是構(gòu)建了一個非常簡單的卷積網(wǎng)絡(luò),結(jié)構(gòu)是常見的:卷積層+BN層+ReLU層??梢园l(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()等方法來快速訓(xùn)練。保存和加載模型也是在Model這個級別進(jìn)行的。
現(xiàn)在說一說上面的代碼和pytorch中的區(qū)別,作為一個對比學(xué)習(xí)、也作為一個對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的圖像的四個維度是:
【樣本數(shù)量,通道數(shù),,】
而tensorflow是:
【樣本數(shù)量,,,通道數(shù)】
總之,學(xué)了pytorch之后,再看keras的話,對照的keras的API,很多東西都直接就會了,兩者的API越來越相似了。
上面最后輸出是(16, 56, 56, 32),輸入的是的維度,然后經(jīng)過兩個最大池化層,就變成了了。
到此為止,我們現(xiàn)在應(yīng)該是可以用keras來構(gòu)建模型了。
- END -往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯獲取一折本站知識星球優(yōu)惠券,復(fù)制鏈接直接打開:https://t.zsxq.com/662nyZF本站qq群704220115。加入微信群請掃碼進(jìn)群(如果是博士或者準(zhǔn)備讀博士請說明):總結(jié)
以上是生活随笔為你收集整理的【小白学PyTorch】18.TF2构建自定义模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Github标星86.4K+:常见数据结
- 下一篇: 【数据竞赛】Kaggle竞赛宝典国内外竞