1. 程式人生 > >SE-Inception v3架構的模型搭建(keras程式碼實現)

SE-Inception v3架構的模型搭建(keras程式碼實現)

首先,先上SENet架構的原理圖:

description

圖是將SE模組嵌入到Inception結構的一個示例。方框旁邊的維度資訊代表該層的輸出。這裡我們使用global average pooling作為Squeeze操作。緊接著兩個Fully Connected 層組成一個Bottleneck結構去建模通道間的相關性,並輸出和輸入特徵同樣數目的權重。我們首先將特徵維度降低到輸入的1/16,然後經過ReLu啟用後再通過一個Fully Connected 層升回到原來的維度。 這樣做比直接用一個Fully Connected層的好處在於:

  1. 具有更多的非線性,可以更好地擬合通道間複雜的相關性;
  2. 極大地減少了引數量和計算量。然後通過一個Sigmoid的門獲得0~1之間歸一化的權重,最後通過一個Scale的操作來將歸一化後的權重加權到每個通道的特徵上。

SENet架構(Squeeze And Excitation),無非就是Squeeze操作和Excitation操作

  • 首先是Squeeze操作,我們順著空間維度來進行特徵壓縮,將每個二維的特徵通道變成一個實數,這個實數某種程度上具有全域性的感受野,並且輸出的維度和輸入的特徵通道數相匹配。它表徵著在特徵通道上響應的全域性分佈,而且使得靠近輸入的層也可以獲得全域性的感受野,這一點在很多工中都是非常有用的。
  • 其次是Excitation操作,它是一個類似於迴圈神經網路中門的機制。通過引數 來為每個特徵通道生成權重,其中引數 被學習用來顯式地建模特徵通道間的相關性。
  • 最後是一個Reweight的操作,我們將Excitation的輸出的權重看做是進過特徵選擇後的每個特徵通道的重要性,然後通過乘法逐通道加權到先前的特徵上,完成在通道維度上的對原始特徵的重標定

接下來是程式碼實現:

在此宣告 文中部分是非原創,本人只是為想實現SENet架構的小夥伴們搞個福利,貼了程式碼實現出來以便大家參考使用