最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python神經(jīng)網(wǎng)絡(luò)Xception模型復(fù)現(xiàn)詳解

 更新時(shí)間:2022年05月06日 15:32:07   作者:Bubbliiiing  
這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡(luò)Xception模型復(fù)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Xception是繼Inception后提出的對(duì)Inception v3的另一種改進(jìn),學(xué)一學(xué)總是好的

什么是Xception模型

Xception是谷歌公司繼Inception后,提出的InceptionV3的一種改進(jìn)模型,其改進(jìn)的主要內(nèi)容為采用depthwise separable convolution來替換原來Inception v3中的多尺寸卷積核特征響應(yīng)操作。

在講Xception模型之前,首先要講一下什么是depthwise separable convolution(深度可分離卷積塊)。

深度可分離卷積塊由兩個(gè)部分組成,分別是深度可分離卷積和1x1普通卷積,深度可分離卷積的卷積核大小一般是3x3的,便于理解的話我們可以把它當(dāng)作是特征提取,1x1的普通卷積可以完成通道數(shù)的調(diào)整。

下圖為深度可分離卷積塊的結(jié)構(gòu)示意圖:

深度可分離卷積塊的目的是使用更少的參數(shù)來代替普通的3x3卷積。

我們可以進(jìn)行一下普通卷積和深度可分離卷積塊的對(duì)比:

假設(shè)有一個(gè)3×3大小的卷積層,其輸入通道為16、輸出通道為32。具體為,32個(gè)3×3大小的卷積核會(huì)遍歷16個(gè)通道中的每個(gè)數(shù)據(jù),最后可得到所需的32個(gè)輸出通道,所需參數(shù)為16×32×3×3=4608個(gè)。

應(yīng)用深度可分離卷積,用16個(gè)3×3大小的卷積核分別遍歷16通道的數(shù)據(jù),得到了16個(gè)特征圖譜。在融合操作之前,接著用32個(gè)1×1大小的卷積核遍歷這16個(gè)特征圖譜,所需參數(shù)為16×3×3+16×32×1×1=656個(gè)。

可以看出來depthwise separable convolution可以減少模型的參數(shù)。

通俗地理解深度可分離卷積結(jié)構(gòu)塊,就是3x3的卷積核厚度只有一層,然后在輸入張量上一層一層地滑動(dòng),每一次卷積完生成一個(gè)輸出通道,當(dāng)卷積完成后,再利用1x1的卷積調(diào)整厚度。

(視頻中有些許錯(cuò)誤,感謝zl960929的提醒,Xception使用的深度可分離卷積塊SeparableConv2D也就是先深度可分離卷積再進(jìn)行1x1卷積。)

對(duì)于Xception模型而言,其一共可以分為3個(gè)flow,分別是Entry flow、Middle flow、Exit flow;

分為14個(gè)block,其中Entry flow中有4個(gè)、Middle flow中有8個(gè)、Exit flow中有2個(gè)。

具體結(jié)構(gòu)如下:

其內(nèi)部主要結(jié)構(gòu)就是殘差卷積網(wǎng)絡(luò)搭配SeparableConv2D層實(shí)現(xiàn)一個(gè)個(gè)block,在Xception模型中,常見的兩個(gè)block的結(jié)構(gòu)如下。這個(gè)主要在Entry flow和Exit flow中:

這個(gè)主要在Middle flow中:

Xception網(wǎng)絡(luò)部分實(shí)現(xiàn)代碼

#-------------------------------------------------------------#
#   Xception的網(wǎng)絡(luò)部分
#-------------------------------------------------------------#
from keras.preprocessing import image
from keras.models import Model
from keras import layers
from keras.layers import Dense,Input,BatchNormalization,Activation,Conv2D,SeparableConv2D,MaxPooling2D
from keras.layers import GlobalAveragePooling2D,GlobalMaxPooling2D
from keras import backend as K
from keras.applications.imagenet_utils import decode_predictions
def Xception(input_shape = [299,299,3],classes=1000):
    img_input = Input(shape=input_shape)
    #--------------------------#
    # Entry flow
    #--------------------------#
    #--------------------#
    # block1
    #--------------------#
    # 299,299,3 -> 149,149,64
    x = Conv2D(32, (3, 3), strides=(2, 2), use_bias=False, name='block1_conv1')(img_input)
    x = BatchNormalization(name='block1_conv1_bn')(x)
    x = Activation('relu', name='block1_conv1_act')(x)
    x = Conv2D(64, (3, 3), use_bias=False, name='block1_conv2')(x)
    x = BatchNormalization(name='block1_conv2_bn')(x)
    x = Activation('relu', name='block1_conv2_act')(x)
    #--------------------#
    # block2
    #--------------------#
    # 149,149,64 -> 75,75,128
    residual = Conv2D(128, (1, 1), strides=(2, 2), padding='same', use_bias=False)(x)
    residual = BatchNormalization()(residual)
    x = SeparableConv2D(128, (3, 3), padding='same', use_bias=False, name='block2_sepconv1')(x)
    x = BatchNormalization(name='block2_sepconv1_bn')(x)
    x = Activation('relu', name='block2_sepconv2_act')(x)
    x = SeparableConv2D(128, (3, 3), padding='same', use_bias=False, name='block2_sepconv2')(x)
    x = BatchNormalization(name='block2_sepconv2_bn')(x)
    x = MaxPooling2D((3, 3), strides=(2, 2), padding='same', name='block2_pool')(x)
    x = layers.add([x, residual])
    #--------------------#
    # block3
    #--------------------#
    # 75,75,128 -> 38,38,256
    residual = Conv2D(256, (1, 1), strides=(2, 2),padding='same', use_bias=False)(x)
    residual = BatchNormalization()(residual)
    x = Activation('relu', name='block3_sepconv1_act')(x)
    x = SeparableConv2D(256, (3, 3), padding='same', use_bias=False, name='block3_sepconv1')(x)
    x = BatchNormalization(name='block3_sepconv1_bn')(x)
    x = Activation('relu', name='block3_sepconv2_act')(x)
    x = SeparableConv2D(256, (3, 3), padding='same', use_bias=False, name='block3_sepconv2')(x)
    x = BatchNormalization(name='block3_sepconv2_bn')(x)
    x = MaxPooling2D((3, 3), strides=(2, 2), padding='same', name='block3_pool')(x)
    x = layers.add([x, residual])
    #--------------------#
    # block4
    #--------------------#
    # 38,38,256 -> 19,19,728
    residual = Conv2D(728, (1, 1), strides=(2, 2),padding='same', use_bias=False)(x)
    residual = BatchNormalization()(residual)
    x = Activation('relu', name='block4_sepconv1_act')(x)
    x = SeparableConv2D(728, (3, 3), padding='same', use_bias=False, name='block4_sepconv1')(x)
    x = BatchNormalization(name='block4_sepconv1_bn')(x)
    x = Activation('relu', name='block4_sepconv2_act')(x)
    x = SeparableConv2D(728, (3, 3), padding='same', use_bias=False, name='block4_sepconv2')(x)
    x = BatchNormalization(name='block4_sepconv2_bn')(x)
    x = MaxPooling2D((3, 3), strides=(2, 2), padding='same', name='block4_pool')(x)
    x = layers.add([x, residual])
    #--------------------------#
    # Middle flow
    #--------------------------#
    #--------------------#
    # block5--block12
    #--------------------#
    # 19,19,728 -> 19,19,728
    for i in range(8):
        residual = x
        prefix = 'block' + str(i + 5)
        x = Activation('relu', name=prefix + '_sepconv1_act')(x)
        x = SeparableConv2D(728, (3, 3), padding='same', use_bias=False, name=prefix + '_sepconv1')(x)
        x = BatchNormalization(name=prefix + '_sepconv1_bn')(x)
        x = Activation('relu', name=prefix + '_sepconv2_act')(x)
        x = SeparableConv2D(728, (3, 3), padding='same', use_bias=False, name=prefix + '_sepconv2')(x)
        x = BatchNormalization(name=prefix + '_sepconv2_bn')(x)
        x = Activation('relu', name=prefix + '_sepconv3_act')(x)
        x = SeparableConv2D(728, (3, 3), padding='same', use_bias=False, name=prefix + '_sepconv3')(x)
        x = BatchNormalization(name=prefix + '_sepconv3_bn')(x)
        x = layers.add([x, residual])
    #--------------------------#
    # Exit flow
    #--------------------------#
    #--------------------#
    # block13
    #--------------------#
    # 19,19,728 -> 10,10,1024
    residual = Conv2D(1024, (1, 1), strides=(2, 2),
                      padding='same', use_bias=False)(x)
    residual = BatchNormalization()(residual)
    x = Activation('relu', name='block13_sepconv1_act')(x)
    x = SeparableConv2D(728, (3, 3), padding='same', use_bias=False, name='block13_sepconv1')(x)
    x = BatchNormalization(name='block13_sepconv1_bn')(x)
    x = Activation('relu', name='block13_sepconv2_act')(x)
    x = SeparableConv2D(1024, (3, 3), padding='same', use_bias=False, name='block13_sepconv2')(x)
    x = BatchNormalization(name='block13_sepconv2_bn')(x)
    x = MaxPooling2D((3, 3), strides=(2, 2), padding='same', name='block13_pool')(x)
    x = layers.add([x, residual])
    #--------------------#
    # block14
    #--------------------#
    # 10,10,1024 -> 10,10,2048
    x = SeparableConv2D(1536, (3, 3), padding='same', use_bias=False, name='block14_sepconv1')(x)
    x = BatchNormalization(name='block14_sepconv1_bn')(x)
    x = Activation('relu', name='block14_sepconv1_act')(x)
    x = SeparableConv2D(2048, (3, 3), padding='same', use_bias=False, name='block14_sepconv2')(x)
    x = BatchNormalization(name='block14_sepconv2_bn')(x)
    x = Activation('relu', name='block14_sepconv2_act')(x)
    x = GlobalAveragePooling2D(name='avg_pool')(x)
    x = Dense(classes, activation='softmax', name='predictions')(x)
    inputs = img_input
    model = Model(inputs, x, name='xception')
    model.load_weights("xception_weights_tf_dim_ordering_tf_kernels.h5")
    return model

圖片預(yù)測

建立網(wǎng)絡(luò)后,可以用以下的代碼進(jìn)行預(yù)測。

def preprocess_input(x):
    x /= 255.
    x -= 0.5
    x *= 2.
    return x
if __name__ == '__main__':
    model = Xception()
    img_path = 'elephant.jpg'
    img = image.load_img(img_path, target_size=(299, 299))
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    print('Input image shape:', x.shape)
    preds = model.predict(x)
    print(np.argmax(preds))
    print('Predicted:', decode_predictions(preds))

預(yù)測所需的已經(jīng)訓(xùn)練好的Xception模型可以在https://github.com/fchollet/deep-learning-models/releases下載。非常方便。

預(yù)測結(jié)果為:

Predicted: [[('n02504458', 'African_elephant', 0.47570863), ('n01871265', 'tusker', 0.3173351), ('n02504013', 'Indian_elephant', 0.030323735), ('n02963159', 'cardigan', 0.0007877756), ('n02410509', 'bison', 0.00075616257)]]

以上就是python神經(jīng)網(wǎng)絡(luò)Xception模型復(fù)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于Xception模型的復(fù)現(xiàn)詳解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python實(shí)現(xiàn)名片管理系統(tǒng)

    Python實(shí)現(xiàn)名片管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)名片管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • pytorch中交叉熵?fù)p失函數(shù)的使用小細(xì)節(jié)

    pytorch中交叉熵?fù)p失函數(shù)的使用小細(xì)節(jié)

    這篇文章主要介紹了pytorch中交叉熵?fù)p失函數(shù)的使用細(xì)節(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Python繪制3D立體花朵示例詳解

    Python繪制3D立體花朵示例詳解

    情人節(jié)送玫瑰花千篇一律?本文將為大家介紹利用Python繪制多種3D立體花朵的示例代碼,讓女友感受一下程序員的浪漫!快來跟隨小編一起學(xué)習(xí)一下吧
    2021-12-12
  • Python實(shí)現(xiàn)從腳本里運(yùn)行scrapy的方法

    Python實(shí)現(xiàn)從腳本里運(yùn)行scrapy的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)從腳本里運(yùn)行scrapy的方法,實(shí)例分析了Python腳本運(yùn)行的使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-04-04
  • 使用anaconda的pip安裝第三方python包的操作步驟

    使用anaconda的pip安裝第三方python包的操作步驟

    今天小編就為大家分享一篇使用anaconda的pip安裝第三方python包的操作步驟,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • python的正則表達(dá)式和re模塊詳解

    python的正則表達(dá)式和re模塊詳解

    這篇文章主要為大家詳細(xì)介紹了python的正則表達(dá)式和re模塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • 通過Python實(shí)現(xiàn)猜燈謎游戲的示例代碼

    通過Python實(shí)現(xiàn)猜燈謎游戲的示例代碼

    新的一年迎來了元宵節(jié),元宵佳節(jié)在陪伴家人的同時(shí),自然也少不了賞花燈,猜燈謎的項(xiàng)目。本文會(huì)通過Python實(shí)現(xiàn)這一游戲,需要的可以參考一下
    2022-02-02
  • python對(duì)象銷毀實(shí)例(垃圾回收)

    python對(duì)象銷毀實(shí)例(垃圾回收)

    今天小編就為大家分享一篇python對(duì)象銷毀實(shí)例(垃圾回收),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • python爬取分析超級(jí)大樂透歷史開獎(jiǎng)數(shù)據(jù)

    python爬取分析超級(jí)大樂透歷史開獎(jiǎng)數(shù)據(jù)

    這篇文章主要介紹了python爬取分析超級(jí)大樂透歷史開獎(jiǎng)數(shù)據(jù),本次使用了requests和beautifulsoup庫進(jìn)行數(shù)據(jù)的爬取,通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • Django ORM 聚合查詢和分組查詢實(shí)現(xiàn)詳解

    Django ORM 聚合查詢和分組查詢實(shí)現(xiàn)詳解

    這篇文章主要介紹了Django ORM 聚合查詢和分組查詢實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評(píng)論

武义县| 乌拉特中旗| 竹溪县| 阳朔县| 屏南县| 武宣县| 湘阴县| 泾阳县| 中方县| 兴城市| 永和县| 收藏| 营口市| 伊吾县| 昔阳县| 探索| 雷波县| 天镇县| 涪陵区| 云霄县| 新蔡县| 吉木乃县| 富宁县| 宜丰县| 勃利县| 阳江市| 南康市| 双峰县| 六枝特区| 水富县| 应用必备| 四平市| 昌平区| 屏东市| 合肥市| 舞阳县| 沛县| 遵义市| 桐柏县| 绍兴市| 鄂温|