作者:Vardan Agarwal
編譯:ronghuaiyang
導讀
深入研究所有不同EfficientNet結構的細節。
我在一個Kaggle競賽中翻閱notebooks,發現幾乎每個人都在使用EfficientNet 作為他們的主幹,而我之前從未聽說過這個。谷歌AI在這篇文章中:介紹了它,他們試圖提出一種更高效的方法,就像它的名字所建議的那樣,同時改善了最新的結果。一般來說,模型設計得太寬,太深,或者解析度太高。剛開始的時候,增加這些特性是有用的,但很快就會飽和,然後模型的引數會很多,因而效率不高。在EfficientNet中,這些特性是按更有原則的方式擴充套件的,也就是說,一切都是逐漸增加的。
不明白髮生了什麼?不要擔心,一旦看到了架構,你就會明白了。但首先,讓我們看看他們得到了什麼結果。
由於引數的數目相當少,這個模型族是非常高效的,也提供更好的結果。現在我們知道了為什麼這些可能會成為標準的預訓練模型,但是缺少了一些東西。
共同之處
首先,任何網路都以它為主幹,在此之後,所有對架構的實驗都以它為開始,這在所有8個模型和最後的層中都是一樣的。
之後,每個主幹包含7個block。這些block還有不同數量的子block,這些子block的數量隨著EfficientNetB0到EfficientNetB7而增加。要視覺化模型層,程式碼如下:
!pip
install tf-nightly-gpu
import tensorflow
as tf
IMG_SHAPE = (
224,
224,
3)
model0 = tf.keras.applications.EfficientNetB0(input_shape=IMG_SHAPE, include_top=
False, weights=
"imagenet")
tf.keras.utils.plot_model(model0)
# to draw and visualize
model0.summary() # to see the list of layers and parameters
如果你計算EfficientNet-B0的總層數,總數是237層,而EfficientNet-B7的總數是813層!!但不用擔心,所有這些層都可以由下面的5個模組和上面的主幹組成。
我們使用這5個模組來構建整個結構。
- 模組1 — 這是子block的起點。
- 模組2 — 此模組用於除第一個模組外的所有7個主要模組的第一個子block的起點。
- 模組3 — 它作為跳躍連線到所有的子block。
- 模組4 — 用於將跳躍連線合併到第一個子block中。
- 模組5 — 每個子block都以跳躍連線的方式連線到之前的子block,並使用此模組進行組合。
這些模組被進一步組合成子block,這些子block將在block中以某種方式使用。
- 子block1 — 它僅用於第一個block中的第一個子block。
- 子block2 — 它用作所有其他block中的第一個子block。
- 子block3 — 用於所有block中除第一個外的任何子block。
到目前為止,我們已經指定了要組合起來建立EfficientNet模型的所有內容,所以讓我們開始吧。
EfficientNet-B0
EfficientNet-B1
EfficientNet-B2
它的架構與上面的模型相同,唯一的區別是特徵圖(通道)的數量不同,增加了引數的數量。
EfficientNet-B3
EfficientNet-B4
EfficientNet-B5
EfficientNet-B6
EfficientNet-B7
很容易看出各個模型之間的差異,他們逐漸增加了子block的數量。如果你理解了體系結構,我鼓勵你將任意的模型列印出來,並仔細閱讀它以更徹底地瞭解它。下面的表表示了EfficientNet-B0中卷積操作的核心大小以及解析度、通道和層。
此表已包含在原始論文中。對於整個模型族來說,解析度是一樣的。我不確定卷積核的大小是否改變了。層的數量已經在上面的圖中顯示了。通道數量是不同的,它是根據從每個型號的摘要中看到的資訊計算出來的,如下所示:
在結束之前,我附上了另一個影像,來自它的研究論文,顯示了它與其他的SO他的performance的比較,還有減少的引數的數量和所需的FLOPS。
英文原文: