日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【神经网络】(19) ConvNeXt 代码复现,网络解析,附Tensorflow完整代码

發布時間:2023/11/27 生活经验 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【神经网络】(19) ConvNeXt 代码复现,网络解析,附Tensorflow完整代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

各位同學好,今天和大家分享一下如何使用 Tensorflow 構建 ConvNeXt 卷積神經網絡模型。

論文地址:https://arxiv.org/pdf/2201.03545.pdf

完整代碼在我的Gitee中:https://gitee.com/dgvv4/neural-network-model/tree/master/

21年Transformer頻頻跨界視覺領域,先是在圖像分類上被谷歌ViT突破,后來在目標檢測和圖像分割又被微軟Swin Transformer拿下。隨著投身視覺Transformer研究的學者越來越多,三大任務榜單皆被Transformer或兩種架構結合的模型占據頭部,這時ConvNeXt代表卷積神經網絡站了出來。


1. ConvNeXt Block 模塊

1.1 基本結構

(1)ConvNeXt 使用了分組卷積的思想,和MobileNetV1中的深度卷積(Depthwise Conv)相同。輸入特征圖有多少個通道數,就有多少個卷積核,每個卷積核處理一個對應的通道,每個卷積核生成一張特征圖。將所有生產的特征圖在通道維度上堆疊,那么就有輸入特征圖的通道數和輸出特征圖的通道數相同。

(2)逆轉殘差結構,先1*1卷積升維,后1*1卷積降維。借鑒了MobileNetV2的逆轉殘差結構。較小的模型上準確率由80.5%提升到了80.6%,在較大的模型上準確率由81.9%提升到82.6%。

可參考我之前的文章:https://blog.csdn.net/dgvv4/article/details/123476899

(3)更少的標準化層,使用 Layer Normalization 代替 Batch Normalization。作者借鑒了Transformer 的結構,只保留深度卷積之后的標準化層,替換后準確率得到小幅提高。


1.2 代碼展示

下面代碼中 gama 是對1*1降維卷積的輸出特征圖的數據進行縮放。gama 是一個可學習的變量,在網絡訓練過程中,反向傳播優化gama的值。

gama 是一個一維向量,它的元素個數和輸出特征圖的通道數相同。向量中的每個元素處理一張對應的特征圖,某張特征圖的所有像素值依次和向量的某個元素相乘,達到縮放特征圖數據的目的。

定義可訓練參數 add_weight() 是?Layer類下面的一個方法,使用之前,先對Layer類實例化,layers.Layer()

#(2)ConvNeXt Block
def block(inputs, dropout_rate=0.2, layer_scale_init_value=1e-6):'''layer_scale_init_value 縮放比例gama的初始化值'''# 獲取輸入特征圖的通道數dim = inputs.shape[-1]# 殘差邊residual = inputs# 7*7深度卷積x = layers.DepthwiseConv2D(kernel_size=(7,7), strides=1, padding='same')(inputs)# 標準化x = layers.LayerNormalization()(x)# 1*1標準卷積上升通道數4倍x = layers.Conv2D(filters=dim*4, kernel_size=(1,1), strides=1, padding='same')(x)# GELU激活函數x = layers.Activation('gelu')(x)# 1*1標準卷積下降通道數x = layers.Conv2D(filters=dim, kernel_size=(1,1), strides=1, padding='same')(x)# 創建可學習的向量gama,該函數用于向某一層添加權重變量,類實例化layers.Layer()gama = layers.Layer().add_weight(shape=[dim],  # 向量個數和輸出特征圖通道數量一致initializer=tf.initializers.Constant(layer_scale_init_value),  # 權重初始化dtype=tf.float32,  # 指定數據類型trainable=True)  # 可訓練參數,可通過反向傳播調整權重# layer scale 對特征圖的每一個通道數據進行縮放,縮放比例gamax = x * gama  # [56,56,96]*[96]==>[56,56,96]# Dropout層隨機殺死神經元x = layers.Dropout(rate=dropout_rate)(x)# 殘差連接輸入和輸出x = layers.add([x, residual])return x

2. 主干網絡

2.1 網絡結構圖


2.2 設計方案

網絡架構。如上圖,在ResNet50網絡中,res2到res5堆疊block的次數是(3, 4, 6, 3)比例大概是1:1:2:1,但在Swin Transformer中,比如Swin-T的比例是1:1:3:1,Swin-L的比例是1:1:9:1。很明顯,在Swin Transformer中堆疊block的占比更高。所以作者就將ResNet50中的堆疊次數由(3, 4, 6, 3)調整成(3, 3, 9, 3),和Swin-T擁有相似的FLOPs。

下采樣層的設計。ResNet網絡的下采樣都是通過將主分支上3x3的卷積層步距設置成2,殘差邊上1x1的卷積層的步長設置成2。但在Swin Transformer中是通過一個單獨的Patch Merging實現的。作者借鑒Swin-T為ConvNext網絡單獨使用了一個下采樣層,由一個Laryer Normalization 加上一個 kernel_size=2 且 strides=2 的卷積層構成。


2.3 完整代碼展示

ConvNeXt使用的全部都是現有的結構和方法,沒有任何結構或者方法的創新。而且代碼也非常的精簡,100多行代碼就能搭建完成

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import Model, layers#(1)輸入圖像經過的第一個卷積塊
def pre_Conv(inputs, out_channel):# 4*4卷積+標準化x = layers.Conv2D(filters=out_channel,  # 輸出特征圖的通道數kernel_size=(4,4),strides=4,  # 下采樣padding='same')(inputs)x = layers.LayerNormalization()(x)return x#(2)ConvNeXt Block
def block(inputs, dropout_rate=0.2, layer_scale_init_value=1e-6):'''layer_scale_init_value 縮放比例gama的初始化值'''# 獲取輸入特征圖的通道數dim = inputs.shape[-1]# 殘差邊residual = inputs# 7*7深度卷積x = layers.DepthwiseConv2D(kernel_size=(7,7), strides=1, padding='same')(inputs)# 標準化x = layers.LayerNormalization()(x)# 1*1標準卷積上升通道數4倍x = layers.Conv2D(filters=dim*4, kernel_size=(1,1), strides=1, padding='same')(x)# GELU激活函數x = layers.Activation('gelu')(x)# 1*1標準卷積下降通道數x = layers.Conv2D(filters=dim, kernel_size=(1,1), strides=1, padding='same')(x)# 創建可學習的向量gama,該函數用于向某一層添加權重變量,類實例化layers.Layer()gama = layers.Layer().add_weight(shape=[dim],  # 向量個數和輸出特征圖通道數量一致initializer=tf.initializers.Constant(layer_scale_init_value),  # 權重初始化dtype=tf.float32,  # 指定數據類型trainable=True)  # 可訓練參數,可通過反向傳播調整權重# layer scale 對特征圖的每一個通道數據進行縮放,縮放比例gamax = x * gama  # [56,56,96]*[96]==>[56,56,96]# Dropout層隨機殺死神經元x = layers.Dropout(rate=dropout_rate)(x)# 殘差連接輸入和輸出x = layers.add([x, residual])return x#(3)下采樣層
def downsampling(inputs, out_channel):# 標準化+2*2卷積下采樣x = layers.LayerNormalization()(inputs)x = layers.Conv2D(filters=out_channel,  # 輸出通道數個數kernel_size=(2,2),strides=2,  # 下采樣padding='same')(x)return x#(4)卷積塊,一個下采樣層+多個block卷積層
def stage(x, num, out_channel, downsampe=True):'''num:重復執行多少次block ; out_channel代表下采樣層輸出通道數downsampe:判斷是否執行下采樣層'''if downsampe is True:x = downsampling(x, out_channel)# 重復執行num次block,每次輸出的通道數都相同for _ in range(num):x = block(x)return x#(5)主干網絡
def convnext(input_shape, classes):  # 輸入圖像shape和分類類別數# 構造輸入層inputs = keras.Input(shape=input_shape)# [224,224,3]==>[56,56,96]x = pre_Conv(inputs, out_channel=96)# [56,56,96]==>[56,56,96]x = stage(x, num=3, out_channel=96, downsampe=False)# [56,56,96]==>[28,28,192]x = stage(x, num=3, out_channel=192, downsampe=True)# [28,28,192]==>[14,14,384]x = stage(x, num=9, out_channel=384, downsampe=True)# [14,14,384]==>[7,7,768]x = stage(x, num=3, out_channel=768, downsampe=True)# [7,7,768]==>[None,768]x = layers.GlobalAveragePooling2D()(x)x = layers.LayerNormalization()(x)# [None,768]==>[None,classes]logits = layers.Dense(classes)(x)  # 不經過softmax# 構建網絡model = Model(inputs, logits)return model#(6)接收網絡模型
if __name__ == '__main__':# 構造網絡,傳入輸入圖像的shape,和最終輸出的分類類別數model = convnext(input_shape=[224,224,3], classes=1000)model.summary()  # 查看網絡結構

網絡參數如下

==================================================================================================
Total params: 28,582,504
Trainable params: 28,582,504
Non-trainable params: 0
__________________________________________________________________________________________________

3. 網絡模型圖

感謝?太陽花的小綠豆?博主的模型圖

總結

以上是生活随笔為你收集整理的【神经网络】(19) ConvNeXt 代码复现,网络解析,附Tensorflow完整代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。