天天看點

多模态比對模型之圖像預處理EfficientNet算法

作者:西安是我家吖

多模态比對

兩個商品的名稱各異(如iPhone 和蘋果), 但是它們的圖像往往是相同或相似的,為此考慮引入商品的圖像資訊來進行輔助聚合。以計算商品相似度為例:

多模态比對模型之圖像預處理EfficientNet算法

将商品的名稱和圖像分别通過文本編碼器和圖像編碼器得到對應的向量表示後,再進行拼接作為最終的商品向量,最後使用餘弦相似度來衡量商品之間的相似度。

文本編碼器:使用文本預訓練模型 BERT作為文本編碼器,将輸出平均池化後作為文本的向量表示

圖像編碼器:使用圖像預訓練模型 EfficientNet作為圖像編碼器,提取網絡最後一層輸出作為圖像的向量表示

EfficientNet模型

EfficientNet是一種先進的卷積神經網絡,由谷歌在2019年的論文“efficient entnet: Rethinking Model Scaling for convolutional neural Networks”中訓練并釋出。EfficientNet有8種可選實作(B0到B7),甚至最簡單的EfficientNet B0也是非常出色的。通過530萬個參數,實作了77.1%的最高精度性能。

EfficientNet作者希望找到一個可以同時兼顧速度與精度的模型放縮方法,而提高模型性能基本從下面三個次元考慮:網絡深度、網絡寬度、圖像分辨率。如 ResNet-18 到 ResNet-152 是通過增加網絡深度的方法來提高準确率,通過深度增加來提取更多複雜的特征,提取的資訊更為豐富。GoogLeNet的Inception結構則是通過增加寬度來提高準确率。作者認為深度、寬度、分辨率這三個次元是互相影響的,三者需要達到一個平衡,要探索出三者之間最好的組合,最後提出了EfficientNet,它是第一個量化三個次元之間關系的網絡。

網絡深度——神經網絡的層數 網絡寬度——每層的通道數 網絡分辨率——是指網絡中特征圖的分辨率(如224×224)

EfficientNet模型的調參示意圖:

多模态比對模型之圖像預處理EfficientNet算法

圖a是baseline(基礎網絡),圖b,c,d三個網絡分别對該基礎網絡的寬度、深度、和輸入分辨率(resolution)進行了擴充,即單獨對某一個次元進行擴充,而最右邊的e圖,就是EfficientNet的主要思想,綜合寬度、深度和分辨率對網絡進行擴充,平衡了三個次元,并且需要一個很好的baseline,在這樣的基礎網絡上進行平衡效果會更好。

重點結論:放大網絡寬度、深度或分辨率中任何一個次元都可以提高準确率,但是對于更大的模型準确率的收益減少,如ResNet可以深度增加到1000層,但是準确率和101層基本相同,準确率很快飽和,準确曲線變平穩,增加很少。

問題:既然三者是有聯系的,那麼如何平衡三者,讓網絡達到最優呢?

在這篇文章中,我們提出了一個新的複合縮放方法,使用一個複合系數ϕ 來縮放網絡寬度,深度和分辨率。如下圖,d、w、r表述三個複合系數,并且限制α⋅β2⋅γ 2≈2,其中α,β,γ≥1,這樣可以使得計算量每次增加基本相同的量,且不會增加太大。

多模态比對模型之圖像預處理EfficientNet算法

EfficientNet-B0是用MnasNet的方法搜出來的,利用這個作為baseline來聯合調整深度、寬度以及分辨率的效果明顯要比ResNet或者MobileNetV2要好,由此可見強化學習搜出來的網絡架構上限可能更高。

發現了對于EfficientNet-B0來說最好的值是α = 1.2 , β = 1.1 , γ = 1.15 ,這樣就找到了baseline中三者最好的值,在這個baseline上進行平衡調整,通過調整公式中α,β,γ,并在限制α⋅β2⋅γ 2≈2下,通過不同的ϕ 放大baseline網絡,得到了Efficient-B1到B7,Efficient-B7效果最好,如下圖。

多模态比對模型之圖像預處理EfficientNet算法

EfficientNet-B7在ImageNet上達到了最好的水準,即top-1準确率84.4%/top-5準确率97.1%,然而卻比已有的最好的卷積網絡GPipe模型小了8.4倍,并且運算時間快了6.1倍,EfficientNet-B0的總層數是237層,而EfficientNet-B7的總數是813層。

該模型的建構方法主要包括以下2個步驟:

使用強化學習算法實作的MnasNet模型生成基線模型EfficientNet-B0。

采用複合縮放的方法,在預先設定的記憶體和計算量大小的限制條件下,對EfficientNet-B0模型的深度、寬度(特征圖的通道數)、圖檔大小這三個次元都同時進行縮放,這三個次元的縮放比例由網格搜尋得到。最終輸出了EfficientNet模型。

MnasNet模型

MnasNet模型是Google 團隊提出的一種資源限制的終端 CNN 模型的自動神經結構搜尋方法。該方法使用強化學習的思路進行實作

MnasNet: Platform-Aware Neural Architecture Search for Mobile,探讨了一種使用強化學習設計移動端模型的自動化神經架構搜尋方法。為了解決移動裝置的速度限制,明确地将速度資訊納入搜尋算法的主要獎勵函數中,以便該搜尋能夠識别在準确度和速度之間達到良好折中的模型。

MnasNet其整個流程主要由三部分組成:一個基于 RNN 的控制器,用于學習模型架構并進行采取;一個訓練器,用于建構和訓練模型以獲得準确度;還有一個推理引擎,可使用 TensorFlow Lite 在真實手機上測量模型速度。我們構想出了一個多目标優化問題,以期同時實作高準确度和高速度,并且采用帶有自定義獎勵函數的強化學習算法來尋找帕累托最優解(例如,能夠達到最高準确度但又不會拉低速度的模型)

多模态比對模型之圖像預處理EfficientNet算法

MNasNet的延遲是通過在實際硬體上測出來的真實值,使用的裝置是谷歌的Pixel手機,而傳統的方法是使用FLOPS作為性能評價标準。

EfficientNet使用

在TensorFlow的官方版本中,最新的代碼裡也已經合入了EfficientNet-B0到EfficientNet-B7的模型代碼,在tf.keras架構下,可以像使用ResNet模型一樣,一行代碼就可以完成預訓練模型的下載下傳和加載的過程。

from tensorflow.keras.applications import EfficientNetB0

image = imread('test.jpg')
# 加載預訓練模型
model = EfficientNetB0(weights='imagenet')

# 輸入處理
image_size = model.input_shape[1]
x = center_crop_and_resize(image, image_size=image_size)
x = preprocess_input(x)
x = np.expand_dims(x, 0)

# 預測及解碼
y = model.predict(x)
decode_predictions(y)
           
# 加載EfficientNet(隻是網絡結構,無預訓練參數)
from efficientnet_pytorch import EfficientNet
model = EfficientNet.from_name('efficientnet-b0')
# 加載預訓練EfficientNet
model = EfficientNet.from_pretrained('efficientnet-b5')
print(model)

# 特征提取
# Preprocess image
tfms = transforms.Compose([transforms.Resize(224), transforms.ToTensor(),
    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]),])
img = tfms(Image.open('img.jpg')).unsqueeze(0)
print(img.shape) # torch.Size([1, 3, 224, 224])
# 提取特征
features = model.extract_features(img)
           

EfficientNet号稱是最好的分類網絡,對于單純的端到端分類任務,EfficientNet的系列模型是最優選擇。但作為更細粒度的語義分割任務,在骨幹網的特征環節,如果顯存有限,則EfficientNet系列模型并不是最優選擇。主要原因是該系列模型對GPU的顯存占有率過高。

繼續閱讀