2017-08-08 97 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的串联,让下一层做的合并工作。但是上面的实现确保了由这个混合池产生的张量具有人们从正常的单池操作中也能期望的形式。