如何创建自定义的keras层“最小池”,但忽略零?

时间:2019-04-23 10:33:13

标签: python keras keras-layer

我正在研究带有keras和tensorflow后端的神经网络。 通常,它由卷积层和最大池层构成,例如在vgg16中完成的。对于我的神经网络,我想将最大池化层更改为最小池化层,但是在池化时,该层应忽略零。

例如:

[[0,16],[72,0]] 2x2池化层应该池化16,而不是72(最大池化)。

在keras中有一种简单的方法可以编写此自定义图层吗?

我想可以通过以下方式实现最小池化

min_x = -K.pool2d(-x, pool_size=(2, 2), strides=(2, 2))

现在,它应该另外忽略零。 感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我发现以下一种可能的解决方案。这是最小池的一种解决方法,在最小池之前和最小池之后向所有零添加一个高值,再次减去该高值。我仍在寻找更好的解决方案来解决此问题,因为我认为这并不是最好的方法,尤其是在性能方面。

def min_pool2d(x):

    max_val = K.max(x) + 1 # we gonna replace all zeros with that value
    # replace all 0s with very high numbers
    is_zero = max_val * K.cast(K.equal(x,0), dtype=K.floatx())
    x = is_zero + x

    # execute pooling with 0s being replaced by a high number
    min_x = -K.pool2d(-x, pool_size=(2, 2), strides=(2, 2))

    # depending on the value we either substract the zero replacement or not
    is_result_zero = max_val * K.cast(K.equal(min_x, max_val), dtype=K.floatx()) 
    min_x = min_x - is_result_zero

    return min_x # concatenate on channel