2017-08-08 48 views
2

雖然使用Keras(與TensorFlow後端)調整深卷積網,我想嘗試一個MaxPooling2DAveragePooling2D之間的混合,因爲這兩種策略似乎改善了我的目標的兩個不同方面。最大池和平均池的混合

我想是這樣的:

------- 
    |8 | 1| 
x = ---+--- 
    |1 | 6| 
    ------- 

average_pooling(x)    -> 4 
max_pooling(x)     -> 8 
hybrid_pooling(x, alpha_max=0.0) -> 4 
hybrid_pooling(x, alpha_max=0.25) -> 5 
hybrid_pooling(x, alpha_max=0.5) -> 6 
hybrid_pooling(x, alpha_max=0.75) -> 7 
hybrid_pooling(x, alpha_max=1.0) -> 8 

或者作爲一個公式:

hybrid_pooling(x, alpha_max) = 
    alpha_max * max_pooling(x) + (1 - alpha_max) * average_pooling(x) 

因爲它看起來像沒有提供過這樣的事情了架子,怎麼會這樣以有效的方式實施?

+1

你能解釋一下這兩個池的混合是什麼意思? –

+0

@VladimirBystricky謝謝。我相應地更新了我的問題。 –

+1

你有沒有想過操作的方程式?從你的例子來看,它似乎是一個加權平均值。 – wmacura

回答

0

我現在使用不同的解決方案來組合兩個池化變體。

  • 給張量都彙集功能
  • 連接結果
  • 使用小CONV層,以瞭解如何

當然,這種方法具有較高的計算成本相結合,但也更加靈活。 連接後的conv層可以學會簡單地將兩個合併結果與alpha混合,但最終也可以針對不同的特徵使用不同的alpha,當然也可以像conv層一樣將合併的特徵合併爲一個全新的辦法。

代碼(Keras功能API)看起來如下:

def hybrid_pool_layer(x, pool_size=(2,2)): 
    return Conv2D(int(x.shape[-1]), (1, 1))(
     keras.layers.concatenate([ 
      MaxPooling2D(pool_size)(x), 
      AveragePooling2D(pool_size)(x)])) 

當然人們也可以離開了Conv2D,就回到兩個poolings的串聯,讓下一層做的合併工作。但是上面的實現確保了由這個混合池產生的張量具有人們從正常的單池操作中也能期望的形式。