Inception網絡

inception網絡

inception介紹

ResNet 爲了使網絡更深,Inception 可以讓神經網絡爲了更寬。Inception 在不增加計算成本的前提下擴展神經網絡的一種方案。
Inception 最早的論文關注的是一種用於深度網絡的新型構建模塊,現在這一模塊被稱爲「Inception module」。其核心模塊源自兩種思想見解的交匯。
第一個見解與對層的操作有關。在傳統的卷積網絡中,每一層都會從之前的層提取信息,以便將輸入數據轉換成更有用的表徵。但是,不同類型的層會提取不同種類的信息。5×5 卷積核的輸出中的信息就和 3×3 卷積核的輸出不同,又不同於最大池化核的輸出,在任意給定層,我們怎麼知道什麼樣的變換能提供最「有用」的信息呢?
見解 1:讓模型自己選擇
Inception 模塊會並行計算同一輸入映射上的多個不同變換,並將它們的結果都連接到單一一個輸出。換句話說,對於每一個層,Inception 都會執行 5×5 卷積變換、3×3 卷積變換和最大池化。然後該模型的下一層會決定是否以及怎樣使用各個信息。

在這裏插入圖片描述
這種模型架構的信息密度更大了,這就帶來了一個突出的問題:計算成本大大增加。不僅大型(比如 5×5)卷積過濾器的固有計算成本高,並排堆疊多個不同的過濾器更會極大增加每一層的特徵映射的數量。而這種計算成本增長就成爲了我們模型的致命瓶頸。
想一下,每額外增加一個過濾器,我們就必須對所有輸入映射進行卷積運算以計算單個輸出。如下圖所示:從單個過濾器創建一個輸出映射涉及到在之前一層的每個單個映射上執行計算。
在這裏插入圖片描述
假設這裏有 M 個輸入映射。增加一個過濾器就意味着要多卷積 M 次映射;增加 N 個過濾器就意味着要多卷積 N*M 次映射。換句話說,正如作者指出的那樣:「過濾器數量的任何統一增長都會導致計算量的 4 倍增長。」我們的樸素 Inception 模塊只是將過濾器的數量增加了三四倍。計算成本大量增加。

見解 2:1x1卷積核降維

使用 1×1 卷積來執行降維。爲了解決上述計算瓶頸,Inception 的作者使用了 1×1 卷積來「過濾」輸出的深度。一個 1×1 卷積一次僅查看一個值,但在多個通道上,它可以提取空間信息並將其壓縮到更低的維度。比如,使用 20 個 1×1 過濾器,一個大小爲 64×64×100(具有 100 個特徵映射)的輸入可以被壓縮到 64×64×20。通過減少輸入映射的數量,Inception 可以將不同的層變換並行地堆疊到一起,從而得到既深又寬(很多並行操作)的網絡。
在這裏插入圖片描述

Googlenet

GoogLeNet 有 9 個線性堆疊的 Inception 模塊。它有 22 層(包括池化層的話是 27 層)。該模型在最後一個 inception 模塊處使用全局平均池化。

爲了阻止該網絡中間部分梯度的「消失」過程,作者引入了兩個輔助分類器(上圖紫色框)。它們對其中兩個 Inception 模塊的輸出執行 softmax 操作,然後在同樣的標籤上計算輔助損失。總損失即輔助損失和真實損失的加權和。該論文中對每個輔助損失使用的權重值是 0.3。
在這裏插入圖片描述

Inception v2

問題:
減少特徵的表徵性瓶頸。直觀上來說,當卷積不會大幅度改變輸入維度時,神經網絡可能會執行地更好。過多地減少維度可能會造成信息的損失,這也稱爲「表徵性瓶頸」。
使用更優秀的因子分解方法,卷積才能在計算複雜度上更加高效。
解決方案:
將 5×5 的卷積分解爲兩個 3×3 的卷積運算以提升計算速度。儘管這有點違反直覺,但一個 5×5 的卷積在計算成本上是一個 3×3 卷積的 2.78 倍。所以疊加兩個 3×3 卷積實際上在性能上會有所提升,如下圖所示:

在這裏插入圖片描述
此外,作者將 n*n 的卷積核尺寸分解爲 1×n 和 n×1 兩個卷積。例如,一個 3×3 的卷積等價於首先執行一個 1×3 的卷積再執行一個 3×1 的卷積。他們還發現這種方法在成本上要比單個 3×3 的卷積降低 33%,這一結構如下圖所示:
在這裏插入圖片描述
模塊中的濾波器組被擴展(即變得更寬而不是更深),以解決表徵性瓶頸。如果該模塊沒有被拓展寬度,而是變得更深,那麼維度會過多減少,造成信息損失。如下圖所示:
在這裏插入圖片描述

Inception v3

問題:

  • 作者注意到輔助分類器直到訓練過程快結束時纔有較多貢獻,那時準確率接近飽和。作者認爲輔助分類器的功能是正則化,尤其是它們具備BatchNorm 或 Dropout 操作時。
  • 是否能夠改進 Inception v2 而無需大幅更改模塊仍需要調查。

解決方案:

Inception Net v3 整合了前面 Inception v2 中提到的所有升級,還使用了:

  • RMSProp 優化器;
  • Factorized 7x7 卷積;
  • 輔助分類器使用了 BatchNorm;
  • 標籤平滑(添加到損失公式的一種正則化項,旨在阻止網絡對某一類別過分自信,即阻止過擬合)。

Inception 很快就變成了一種具有決定性意義的模型架構。最新的版本 Inception v4 甚至將殘差連接放進了每一個模組中,創造出了一種 Inception-ResNet 混合結構。但更重要的是,Inception 展現了經過良好設計的「網中有網」架構的能力,讓神經網絡的表徵能力又更上了一層樓。

使用keras預訓練模型對任意圖片進行預測

import numpy as np
from keras.preprocessing import image
from keras.applications import inception_v3
from keras.applications.inception_v3 import preprocess_input, decode_predictions
model = inception_v3.InceptionV3(weights='imagenet')
img = image.load_img("pic/lena.png", target_size=(299, 299))
input_image = image.img_to_array(img)
input_image /= 255.
input_image -= 0.5
input_image *= 2.
# Add a 4th dimension for batch size (Keras)
input_image = np.expand_dims(input_image, axis=0)
# Run the image through the NN
predictions = model.predict(input_image)
# Convert the predictions into text
predicted_classes = inception_v3.decode_predictions(predictions, top=1)
imagenet_id, name, confidence = predicted_classes[0][0]
print("This is a {} with {:-4}% confidence!".format(name, confidence * 100))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章