我正在研究带有keras和tensorflow后端的神经网络。 通常,它由卷积层和最大池层构成,例如在vgg16中完成的。对于我的神经网络,我想将最大池化层更改为最小池化层,但是在池化时,该层应忽略零。
例如:
[[0,16],[72,0]] 2x2池化层应该池化16,而不是72(最大池化)。
在keras中有一种简单的方法可以编写此自定义图层吗?
我想可以通过以下方式实现最小池化
min_x = -K.pool2d(-x, pool_size=(2, 2), strides=(2, 2))
现在,它应该另外忽略零。 感谢您的帮助!
答案 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