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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用PaddleFluid和TensorFlow实现图像分类网络SE_ResNeXt | 文末超大福利

發(fā)布時(shí)間:2024/10/8 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用PaddleFluid和TensorFlow实现图像分类网络SE_ResNeXt | 文末超大福利 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


專欄介紹:Paddle Fluid 是用來讓用戶像 PyTorch 和 Tensorflow Eager Execution 一樣執(zhí)行程序。在這些系統(tǒng)中,不再有模型這個(gè)概念,應(yīng)用也不再包含一個(gè)用于描述 Operator 圖或者一系列層的符號(hào)描述,而是像通用程序那樣描述訓(xùn)練或者預(yù)測(cè)的過程。


本專欄將推出一系列技術(shù)文章,從框架的概念、使用上對(duì)比分析 TensorFlow 和 Paddle Fluid,為對(duì) PaddlePaddle 感興趣的同學(xué)提供一些指導(dǎo)。

視覺(vision)、自然語言處理(Nature Language Processing, NLP)、語音(Speech)是深度學(xué)習(xí)研究的三大方向。三大領(lǐng)域各自都誕生了若干經(jīng)典的模塊,用來建模該領(lǐng)域數(shù)據(jù)所蘊(yùn)含的不同特性的模式。上一篇文章介紹了 PaddleFluid 和 TensorFlow 的設(shè)計(jì)和核心概念,這一篇我們從圖像任務(wù)開始,使用 PaddleFluid 和 TensorFlow 來寫一個(gè)完全相同的網(wǎng)絡(luò),通過這種方式了解我們的使用經(jīng)驗(yàn)如何在不同平臺(tái)之間遷移,從而幫助我們選擇便利的工具,集中于機(jī)器學(xué)習(xí)任務(wù)本身。?


這一篇我們使用圖像分類中的 SE_ResNeXt [1][2] 作為實(shí)踐任務(wù)。?


SE 全稱 Sequeeze-and-Excitation,SE block 并不是一個(gè)完整的網(wǎng)絡(luò)結(jié)構(gòu),而是一個(gè)子結(jié)構(gòu),可以嵌到其他分類或檢測(cè)模型中。SENet block 和 ResNeXt 的結(jié)合在 ILSVRC 2017 的分類項(xiàng)目中取得 了第一名的成績(jī)。在 ImageNet 數(shù)據(jù)集上將 top-5 錯(cuò)誤率從原先的最好成績(jī) 2.991% 降低到 2.251%。


如何使用代碼


本篇文章配套有完整可運(yùn)行的代碼,代碼包括以下幾個(gè)文件:



在終端運(yùn)行下面的命令便可以使用 PaddleFluid 進(jìn)行模型的訓(xùn)練,訓(xùn)練過程如果未在當(dāng)前工作目錄下的 cifar-10-batches-py 目錄中檢測(cè)到訓(xùn)練數(shù)據(jù)(無需手動(dòng)創(chuàng)建 cifar-10-batches-py 文件夾),會(huì)自動(dòng)從網(wǎng)絡(luò)中下載訓(xùn)練及測(cè)試數(shù)據(jù)。


python?SE_ResNeXt_fluid.py


在命令行運(yùn)行下面的命令便可以使用 TensorFlow 進(jìn)行模型的訓(xùn)練,訓(xùn)練中模型驗(yàn)證以及模型保存:


python?SE_ResNeXt_tensorflow.py


注:本系列的最新代碼,可以在 github 上的 TF2Fluid [3] 中隨時(shí) 獲取。


背景介紹


卷積神經(jīng)網(wǎng)絡(luò)在圖像類任務(wù)上取得了巨大的突破。卷積核作為卷積神經(jīng)網(wǎng)絡(luò)的核心,通常被看做是在局部感受野上將空間上(spatial)的信息和通道(channel)上的信息進(jìn)行聚合的信息聚合體。 通常,一個(gè)卷積 Block 由卷積層、非線性層和下采樣層(Pooling 層)構(gòu)成,一個(gè)卷積神經(jīng)網(wǎng)絡(luò)則由一系列堆疊的卷積 block 構(gòu)成。隨著卷積 Block 的層數(shù)的加深,感受野也在不斷擴(kuò)大,最終達(dá)到從全局感受野上捕獲圖像的特征來進(jìn)行圖像的描述的目標(biāo)。?


Squeeze-and-Excitation (SE)模塊?


圖像領(lǐng)域很多研究工作從不同角度出發(fā)研究如何構(gòu)建更加強(qiáng)有力的網(wǎng)絡(luò)學(xué)習(xí)圖像特征。例如,如 Inception 結(jié)構(gòu)中嵌入了多尺度信息:使用多個(gè)不同卷積核,聚合多種不同感受野上的特征來獲得性能增益;將 Attention 機(jī)制引入到空間(spatial)維度上等,都獲得了相當(dāng)不錯(cuò)的成果。


除了上角度,很自然會(huì)想到,是否可以從考慮特征通道(channel)之間的關(guān)系出發(fā),增強(qiáng)網(wǎng)絡(luò)性能?這正是 Squeeze-and-Excitation 模塊的設(shè)計(jì)動(dòng)機(jī)。?


SE block 由兩個(gè)非常關(guān)鍵的操作,Squeeze 和 Excitation 構(gòu)成, 其核心思想是:顯式地建模特征通道之間的相互依賴關(guān)系,通過自適應(yīng)學(xué)習(xí)的方式來獲取每個(gè)特征通道的重要程度,然后依照這個(gè)重要程度去提升有用的特征(有用 feature map 權(quán)重增大 )并抑制對(duì)當(dāng)前任務(wù)用處不大的特征(無效或效果小的 feature map 權(quán)重減小),達(dá)到更好的模型效果。?


下圖是 SE Block 示意圖,來自 參考文獻(xiàn) [1] 中的 Figure 1。


▲?圖 1. SE block示意圖


Squeeze 操作,圖 1 中的?


通過一個(gè)全局的 pooling 操作,沿著空間維度進(jìn)行特征壓縮,將每個(gè)二維的特征通道(channel)變成一個(gè)實(shí)數(shù)。這個(gè)實(shí)數(shù)一定程度上具有全局的感受野。Squeeze 操作的輸出維度和輸入 feature map 的特征通道數(shù)完全相等,表征著在特征通道維度上響應(yīng)的全局分布,Squeeze 使得靠近輸入的層也可以獲得全局的感受野,這在很多任務(wù)中都是非常有用。?


Excitation 操作,圖 1 中的:?


類似與門機(jī)制。通過參數(shù)WW的作用,為每個(gè)特征通道學(xué)習(xí)一個(gè)權(quán)重,其中 可學(xué)習(xí)參數(shù)WW用來顯式地建模特征通道間的相關(guān)性。?


Scale 加權(quán)操作:?


最后一步,將 Excitation 的輸出的權(quán)重看做是經(jīng)過特征選擇后每個(gè)特征通道的重要性,然后通過 scale 逐通道對(duì)原始特征進(jìn)行 reweight,完成在通道維度上的對(duì)原始特征的重標(biāo)定(recalibration)。?


當(dāng) SE block 嵌入原有一些分類網(wǎng)絡(luò)中時(shí),不可避免會(huì)增加需要學(xué)習(xí)的參數(shù)和 引入計(jì)算量,但是 SE block 帶來的計(jì)算量較低,效果面改善依然非常可觀,對(duì)大多數(shù)任務(wù)還是可以接受。?


SE模塊和Residual Connection疊加?


圖 2 是 SE 模塊和 ResNet 中的 Residual Connection 進(jìn)行疊加的原理示意圖,來自參考文獻(xiàn) [1] 中的 Figure 3。


▲?圖 2. SE 模塊與Residual Connection疊加


SE 模塊可以嵌入到含有 Residual Connection 的 ResNet 的模型中,圖 2 右是 SE 疊加 Residual Connection 的示意圖。論文中建議在 Residual Connection 的跨層連接進(jìn)行 Addition 操作前,而不是 Addition 操作之后疊加 SE 模塊:前對(duì)分支上 Residual 的特征進(jìn)行了特征重標(biāo)定(recalibration),是由于如果主干上存在 0 ~ 1 的 scale 操作(extraction 步驟),在網(wǎng)絡(luò)較深時(shí)候,反向傳播算法進(jìn)行到網(wǎng)絡(luò)靠近輸入層時(shí),容易出現(xiàn)梯度消散的情況,導(dǎo)致模型難以優(yōu)化。?


ResNeXt 模型結(jié)構(gòu)?


深度學(xué)習(xí)方法想要提高模型的準(zhǔn)確率,通常會(huì)選擇加深或加寬網(wǎng)絡(luò)。但是隨著網(wǎng)絡(luò)深度或者寬度的增加,網(wǎng)絡(luò)參數(shù)(例如:特征通道數(shù),filter size 等)量也顯著增加,計(jì)算開銷增大。ResNeXt 網(wǎng)絡(luò)結(jié)構(gòu)設(shè)計(jì)的初衷是希望在不增加參數(shù)復(fù)雜度的前提下,提高網(wǎng)絡(luò)的性能,同時(shí)還減少了超參數(shù)的數(shù)量。?


在引出 ResNeXt 網(wǎng)絡(luò)之前,我們首先回顧圖像分類領(lǐng)域兩個(gè)非常重要的工作:VGG 和 Inception 網(wǎng)絡(luò)(這兩個(gè)網(wǎng)絡(luò)的設(shè)計(jì)細(xì)節(jié) PaddleBook 的圖像分類 [4] 一節(jié)有詳細(xì)的介紹)。VGG 網(wǎng)絡(luò)通過堆疊相同形狀的網(wǎng)絡(luò)模塊,這一簡(jiǎn)單策略來構(gòu)建深度網(wǎng)絡(luò),之后的 ResNet 也同樣使用了這一策略。這個(gè)策略降低了超參數(shù)的選擇,在許多不同的數(shù)據(jù)集和任務(wù)上依然 有效工作,展示了很好的魯棒性。?


Inception 的網(wǎng)絡(luò)結(jié)果經(jīng)過精心設(shè)計(jì),遵循:split-transform-merge 策略。在一個(gè) Inception 模型中:(1)split:輸入通過 1×1卷積被切分到幾個(gè)低維 feature map;(2)transform:split 步驟的輸出經(jīng)過一組(多個(gè))filter size 不同的特定濾波器(filters)映射變換;(3)merge:通過 concatenation 將 transform 步驟的結(jié)果融合到一起。


Inception 模型期望通過較低的計(jì)算量來近似大的密集的濾波器的表達(dá)能力。盡管 Inception 模型的精度很好,但是每個(gè) Inception 模塊要量身定制濾波器數(shù)量、尺寸,模塊在每一階段都要改變,特別是當(dāng) Inception 模塊用于新的數(shù)據(jù)或者任務(wù)時(shí)如何修改沒有特別通用的方法。?


ResNeXt 綜合了 VGG 和 Inception 各自的優(yōu)點(diǎn),提出了一個(gè)簡(jiǎn)單架構(gòu):采用? VGG/ResNets 重復(fù)相同網(wǎng)絡(luò)層的策略,以一種簡(jiǎn)單可擴(kuò)展的方式延續(xù) split-transform-merge 策略,整個(gè)網(wǎng)絡(luò)的 building block 都是一樣的,不用在每個(gè) stage 里對(duì)每個(gè) building block 的超參數(shù)進(jìn)行調(diào)整,只用一個(gè)結(jié)構(gòu)相同的 building block,重復(fù)堆疊即可形成整個(gè)網(wǎng)絡(luò)。?


實(shí)圖 3 來自參考文獻(xiàn) [2] 中的Figure 1,展示了 ResNeXt 網(wǎng)絡(luò)的基本 building block。


▲?圖 3. ResNeXt網(wǎng)絡(luò)的基本building block


解釋圖 3 之前要先介紹一個(gè)名詞 cardinality,是指 building block 中變換集合的大小(the size of the set of transformation)。圖 3 中 cardinality=32,將左邊的 64 個(gè)卷積核分成了右邊 32 條不同 path,最后將 32 個(gè) path 的輸出向量的所有通道對(duì)應(yīng)位置相加,再與 Residual connection 相加。?


圖 3 再結(jié)合上一節(jié)中介紹的“SE 模塊和 Residual Connection 疊加”,便構(gòu)成了最終的 SE_ResNeXt 網(wǎng)絡(luò)的 building block,重復(fù)堆疊即可形成整個(gè) ResNeXt。


CIFAR-10 數(shù)據(jù)集介紹


至此,介紹完 ResNeXt 模型的模型原理和基本結(jié)構(gòu),我們準(zhǔn)備開始分別使用 PaddleFluid 和 TensorFlow 構(gòu)建訓(xùn)練任務(wù)。


這一篇我們使用 cifar10 數(shù)據(jù)集 [5][6] 作為實(shí)驗(yàn)數(shù)據(jù)。cifar-10 數(shù)據(jù)集包含 60000 個(gè) 32*32 的彩色圖像,共有 10 類,圖 4 是 cifar10 數(shù)據(jù)集的 10 個(gè)類別。圖 4 是 cifar-10 數(shù)據(jù)集的 10 個(gè)類別示意圖。


▲?圖 4. cifar10數(shù)據(jù)集


cifar10 數(shù)據(jù)集有 50000 個(gè)訓(xùn)練圖像和 10000 個(gè)測(cè)試圖像,被劃分為 5 個(gè)訓(xùn)練塊和 1 個(gè)測(cè)試塊,每個(gè)塊有 10000 個(gè)圖像。測(cè)試塊包含從每類隨機(jī)選擇的 1000 個(gè)圖像。


下載數(shù)據(jù)


運(yùn)行訓(xùn)練程序時(shí), 如果在當(dāng)前執(zhí)行目錄下沒有?cifar-10-batches-py 目錄,或是?cifar-10-batches-py 目錄下沒有已經(jīng)下載好的數(shù)據(jù),PaddleFluid 和 TensorFlow 的數(shù)據(jù)讀取模塊會(huì)調(diào)用 data_utils [7] 中的 download_data 方法自動(dòng) 從網(wǎng)站上下載 cifar-10 數(shù)據(jù)集,無需手動(dòng)下載。


加載cifar-10數(shù)據(jù)集


PaddleFluid?


1. 定義網(wǎng)絡(luò)的輸入層:


上一篇基本使用概念中介紹過 PaddleFluid 模型通過 fluid.layers.data 來接收輸入數(shù)據(jù)。圖像分類網(wǎng)絡(luò)以圖片以及圖片對(duì)應(yīng)的類別標(biāo)簽作為網(wǎng)絡(luò)的輸入:


IMG_SHAPE?=?[3,?32,?32]

images?=?fluid.layers.data(name="image",?shape=IMG_SHAPE,?dtype="float32")
labels?=?fluid.layers.data(name="label",?shape=[1],?dtype="int64")


在上面的代碼片段中, fluid.layers.data 中指定的 shape 無需顯示地指定第 0 維 batch size,框架會(huì)自動(dòng)補(bǔ)充第 0 維,并在運(yùn)行時(shí)填充正確的 batch size。?


一副圖片是一個(gè) 3-D Tensor。PaddleFluid 中卷積操作使用 channel-first 的數(shù)據(jù)輸入格式。因此在接收 原始圖像 數(shù)據(jù)時(shí),shape 的三個(gè)維度其含義分別是:channel、圖片的寬度以及圖片的高度。?


2. 使用 python 語言編寫的 data reader 函數(shù)?


PaddleFluid 中通過 DataFeeder 接口來為對(duì)應(yīng)的 ?fluid.data.layersfeed 數(shù)據(jù),調(diào)用方式如下:


train_reader?=?paddle.batch(train_data(),?batch_size=conf.batch_size)
feeder?=?fluid.DataFeeder(place=place,?feed_list=[images,?labels])


在上面的代碼片段中:?


1. 僅需要用戶編寫 train_data() 這樣一個(gè) python 的 generator。這個(gè)函數(shù) 是 PaddleFluid 要求提供的 data reader 接口,函數(shù)名字不限。?


2. 實(shí)現(xiàn)這個(gè) data reader 接口時(shí)只需要考慮:如何從原始數(shù)據(jù)文件中讀取數(shù)據(jù),返回一條以 numpy ndarrary 格式的訓(xùn)練數(shù)據(jù)


3. 調(diào)用 paddle.batch(train_data(), batch_size=conf.batch_size) 接口會(huì)將數(shù)據(jù)首先讀入一個(gè) pool 中,進(jìn)行 shuffle,然后從 pool 中依次取一個(gè)一個(gè)的 mini-batch。?


完整代碼請(qǐng)參考?train_data() [8],這里不再直接粘貼代碼片段。


TensorFlow?


1. 定義 placeholder?


在 TensorFlow 中,通過定義 placeholder 這樣一個(gè)特殊的 Tensor 來接受輸入數(shù)據(jù)。


IMG_SHAPE?=?[3,?32,?32]
LBL_COUNT?=?10

images?=?tf.placeholder(
????tf.float32,?shape=[None,?IMG_SHAPE[1],?IMG_SHAPE[2],?IMG_SHAPE[0]])
labels?=?tf.placeholder(tf.float32,?shape=[None,?LBL_COUNT])


需要注意的是:?


TensorFlow 中的卷積操作默認(rèn)使用 channel-last 數(shù)據(jù)格式( 也可以在調(diào)用卷積的接口中使用 channel-first 的數(shù)據(jù)格式),images 這個(gè) placeholder 的 shape 和 PaddleFluid 中 images 形狀不同。?


在 placeholder 中,batch size 這樣運(yùn)行時(shí)才可以確定具體數(shù)值的維度使用 None 代替。


2. 通過 feeding 字典為placeholder 提供數(shù)據(jù)?


TensorFlow 通過 session 管理運(yùn)行一個(gè)計(jì)算圖,在 調(diào)用 session 的 run 方法時(shí),提供一個(gè) feeding 字典,將 mini-batch 數(shù)據(jù) feed 給 placeholder。?


下面的代碼片實(shí)現(xiàn)了 加載 cifar-10 數(shù)據(jù)進(jìn)行訓(xùn)練。


image_train,?label_train?=?train_data()
image_test,?label_test?=?train_data()
total_train_sample?=?len(image_train)

for?epoch?in?range(1,?conf.total_epochs?+?1):
????????for?batch_id,?start_index?in?enumerate(
????????????????range(0,?total_train_sample,?conf.batch_size)):
????????????end_index?=?min(start_index?+?conf.batch_size,
????????????????????????????total_train_sample)
????????????batch_image?=?image_train[start_index:end_index]
????????????batch_label?=?label_train[start_index:end_index]

????????????train_feed_dict?=?{
????????????????images:?batch_image,
????????????????labels:?batch_label,
???????????????......
????????????}


上面代碼片段中的 train_data() [7]?完成了原始數(shù)據(jù)的讀取。與 PaddleFluid 中只需考慮讀取一條數(shù)據(jù)由框架完成組 batch 不同,train_data 讀取所有數(shù)據(jù),由用戶程序控制 shuffle 和組 batch。


構(gòu)建網(wǎng)絡(luò)結(jié)構(gòu)


使用不同深度學(xué)習(xí)框架的核心就是使用框架提供的算子構(gòu)建神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)。PaddleFluid 和 TensorFlow 各自提供的基本算子的詳細(xì)說明,可以在各自官網(wǎng)獲取。


這一篇提供了代碼文件 SE_ResNeXt_fluid.py [9] 和 SE_ResNeXt_tensorflow.py [10] 分別是用 PaddleFluid 和 TensorFlow 寫成的 ResNeXt 網(wǎng)絡(luò),兩個(gè)文件中的網(wǎng)絡(luò)結(jié)構(gòu)完全相同,并且代碼結(jié)構(gòu)也完全相同。核心都是 SE_ResNeXt 這個(gè)類,如下面代碼片段所示:


class?SE_ResNeXt(object):
????def?__init__(self,?x,?num_block,?depth,?out_dims,?cardinality,
?????????????????reduction_ratio,?is_training)
:

????????...

????def?transform_layer(self,?x,?stride,?depth):
????????...

????def?split_layer(self,?input_x,?stride,?depth,?layer_name,?cardinality):
????????...

????def?transition_layer(self,?x,?out_dim):
????????...

????def?squeeze_excitation_layer(self,?input_x,?out_dim,?reduction_ratio):
????????...

????def?residual_layer(self,?input_x,?out_dim,?layer_num,?cardinality,?depth,
???????????????????????reduction_ratio,?num_block)
:

????????...

????def?build_SEnet(self,?input_x):
????????...


SE_ResNeXt_fluid.py [9]?和 SE_ResNeXt_tensorflow.py [10]? SE_ResNeXt 類有著完全相同的成員函數(shù),可以通過對(duì)比在兩個(gè)平臺(tái)下實(shí)現(xiàn)同樣功能的代碼,了解如何使用經(jīng)驗(yàn)如何在兩個(gè)平臺(tái)之間遷移。


2-D卷積層使用差異?


2-D 卷積是圖像任務(wù)中的一個(gè)重要操作,卷積核在 2 個(gè)軸向上平移,卷積核的每個(gè)元素與被卷積圖像對(duì)應(yīng)位置相乘,再求和。卷積核的不斷移動(dòng)會(huì)輸出一個(gè)新的圖像,這個(gè)圖像完全由卷積核在各個(gè)位置時(shí)的乘積求和的結(jié)果組成。圖 5 是當(dāng)輸入圖像是 4-D Tensor 時(shí)(batch size 這里固定是 1,也就是 4-D Tensor 的第一維固定為 1),2-D 卷積的可視化計(jì)算過程。


▲?圖 5. RGB 3通道圖像輸入上的2-D卷積

作者 : Martin G?rner / Twitter: @martin_gorner?


卷積計(jì)算的一些細(xì)節(jié)在 PaddleFluid 和 TensorFlow 中略有不同,在這里我們稍作解釋。?


下面是 PaddleFluid 2-D 卷積調(diào)用接口:


fluid.layers.conv2d(
??input,
??num_filters,
??filter_size,
??stride=1,
??padding=0,
??dilation=1,
??groups=None,
??act=None,
??...)


1. 在PaddleFluid卷積使用"channel-first"輸入數(shù)據(jù)格式,也就是常說的“NCHW”格式。


如果輸入圖像是“channel-last”格式,可以在卷積操作之前加入 fluid.layers.transpose operator,對(duì)輸入數(shù)據(jù)的各個(gè)軸進(jìn)行換序。?


2. PaddleFluid 中卷積計(jì)算的 padding 屬性用戶需要自己進(jìn)行計(jì)算,最終輸出圖像的 height 和 width 由下面公式計(jì)算得到:




?padding 屬性 可以接受一個(gè)含有兩個(gè)元素的 python list,分別指定對(duì)圖像 height 方向和 width 方向填充。如果 padding 是一個(gè)整型數(shù)而不是一個(gè) list 使,認(rèn)為 height width 方向填充相同多個(gè) 0。?


這個(gè)邏輯同樣適用于 stride dilation 參數(shù)。


下面是 TensorFlow 2-D 卷積調(diào)用接口:


tf.layers.conv2d(
??inputs,
??filters,
??kernel_size,
??strides=(1,?1),
??padding='valid',
??data_format='channels_last'
??...)


1. 在 TensorFlow 卷積默認(rèn)使用"channel-last"輸入數(shù)據(jù)格式,也就是常說的“NHWC”格式。


2. TensorFlow 中卷積計(jì)算的 padding 屬性可以指定兩種模式:“valid”:不填充;"same":卷積計(jì)算完畢輸出圖像的寬度和高度與輸入圖像相同。


正則項(xiàng)使用差異


L2 正則項(xiàng)作為預(yù)防過擬合的手段之一,在神經(jīng)網(wǎng)絡(luò)訓(xùn)練中有著重要作用。PaddleFluid 平臺(tái)和 TensorFlow 中添加 L2 正則的 使用接口略有不同。?


PaddleFluid?


在 PaddleFluid 中使用 L2 正則這樣的標(biāo)準(zhǔn)正則項(xiàng)較為簡(jiǎn)單,L2 正則作為 optimizer 的一個(gè)參數(shù),直接傳遞正則項(xiàng)系數(shù)即可。


optimizer?=?fluid.optimizer.Momentum(
????learning_rate=conf.learning_rate,
????momentum=0.9,
????regularization=fluid.regularizer.L2Decay(conf.weight_decay))


TensorFlow


在 TensorFlow 中,L2 正則作為損失函數(shù)的一部分,需要顯示地為網(wǎng)絡(luò)中每一個(gè)需要添加 L2 正則項(xiàng)的可學(xué)習(xí)參數(shù)添加 L2 正則。


l2_loss?=?tf.add_n([tf.nn.l2_loss(var)?for?var?in?tf.trainable_variables()])

optimizer?=?tf.train.MomentumOptimizer(
????learning_rate=learning_rate,
????momentum=conf.momentum,
????use_nesterov=conf.use_nesterov)
train?=?optimizer.minimize(cost?+?l2_loss?*?conf.weight_decay)


以上部分是 PaddleFluid 和 TensorFlow 使用中需要關(guān)注的一些差異,ResNeXt 模型在 兩個(gè)平臺(tái)訓(xùn)練的其它接口調(diào)用細(xì)節(jié),可以在代碼 SE_ResNeXt_fluid.py 和 SE_ResNeXt_tensorflow.py 中找到,這里不再粘貼所有代碼,整個(gè)過程都遵循:?


  • 定義網(wǎng)絡(luò)結(jié)構(gòu);?

  • 加載訓(xùn)練數(shù)據(jù);

  • 在一個(gè) for 循環(huán)中讀取 一個(gè)一個(gè) mini-batch 數(shù)據(jù),調(diào)用網(wǎng)絡(luò)的前向和反向計(jì)算,調(diào)用優(yōu)化過程。


總結(jié)


這一篇我們從圖像領(lǐng)域的圖像分類問題入手,使用 PaddleFluid 和 TensorFlow 實(shí)現(xiàn)完全相同 ResNeXt 網(wǎng)絡(luò)結(jié)構(gòu)。 來介紹:?


1. 在 PaddleFluid 和 TensorFlow 中如何讀取并為網(wǎng)絡(luò) feed 圖片數(shù)據(jù);


2. 如何使用 PaddleFluid 和 TensorFlow 中的 2-d 卷積,2-d pooling,pad 等圖像任務(wù)中常用計(jì)算單元;


3. 如何運(yùn)行一個(gè)完整的訓(xùn)練任務(wù),在訓(xùn)練中對(duì)測(cè)試集樣本進(jìn)行測(cè)試。?


可以看到 PaddleFluid 和 TensorFlow 的圖像操作接口高度相似。PaddleFluid 能夠支持與 TensorFlow 同樣豐富的圖像操作,這也是今天主流深度學(xué)習(xí)框架共同的選擇。作為用戶,我們的使用經(jīng)驗(yàn)可以在平臺(tái)之間 非常 簡(jiǎn)單的進(jìn)行遷移,只需要略微關(guān)注接口調(diào)用細(xì)節(jié)的一些差異即可。?


在下面的篇章中,我們將進(jìn)一步在 NLP 任務(wù)中對(duì)比如果使用 PaddleFluid 和 TensorFlow 中的循環(huán)神經(jīng)網(wǎng)絡(luò)單元處理序列輸入數(shù)據(jù)。并且逐步介紹多線程,多卡等主題。


參考文獻(xiàn)


[1].?Hu J, Shen L, Sun G. Squeeze-and-excitation networks[J]. arXiv preprint arXiv:1709.01507, 2017.?

[2]. Xie S, Girshick R, Dollár P, et al. Aggregated residual transformations for deep neural networks[C]//Computer Vision and Pattern Recognition (CVPR), 2017 IEEE Conference on. IEEE, 2017: 5987-5995.?

[3].?TF2Fluid:?https://github.com/JohnRabbbit/TF2Fluid

[4]. PaddleBook圖像分類

http://www.paddlepaddle.org/docs/develop/book/03.image_classification/index.cn.html

[5]. Learning Multiple Layers of Features from Tiny Images, Alex Krizhevsky, 2009.?

https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf

[6]. The CIFAR-10 dataset: https://www.cs.toronto.edu/~kriz/cifar.html

[7].?data_utils

https://github.com/JohnRabbbit/TF2Fluid/blob/master/02_image_classification/data_utils.py#L35

[8].?train_data()

https://github.com/JohnRabbbit/TF2Fluid/blob/master/02_image_classification/cifar10_fluid.py#L43

[9].?SE_ResNeXt_fluid.py

https://github.com/JohnRabbbit/TF2Fluid/blob/master/02_image_classification/SE_ResNeXt_fluid.py

[10].?SE_ResNeXt_tensorflow.py

https://github.com/JohnRabbbit/TF2Fluid/blob/master/02_image_classification/SE_ResNeXt_tensorflow.py



#福 利 時(shí) 間#


以下是簡(jiǎn)單粗暴送福利環(huán)節(jié)


PaperWeekly?× PaddlePaddle?


深度學(xué)習(xí)有獎(jiǎng)?wù){(diào)研

? 50份禮品坐等抱走??


限量版T恤√小白板√機(jī)械鍵盤

?

?參與方式?


掃描下方二維碼提交問卷



我們將從成功作答的用戶中抽取50位

贈(zèng)送限量版禮品一份

總結(jié)

以上是生活随笔為你收集整理的使用PaddleFluid和TensorFlow实现图像分类网络SE_ResNeXt | 文末超大福利的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。