我正在使用keras和tensorflow后端研究神经网络。通常它是用卷积层和最大池层构建的,比如在vgg16中就是这样。对于我的神经网络,我想将最大池化层更改为最小池化层,但在池化时,该层应该忽略零。
例如:
[0,16,72,0] 2x2池层应该池化16,而不是72 (最大池化)。
在keras中有没有一种简单的方法来编写这个定制层?
我猜min pooling是可以通过
min_x = -K.pool2d(-x, pool_size=(2, 2), strides=(2, 2))现在,它应该忽略零作为最小值。谢谢你的帮助!
发布于 2019-04-26 16:07:06
我找到的一个可能的解决方案是下面的一个。这是一种使用最小池化的变通方法,在最小池化之前向所有的零添加一个高值,在最小池化之后再次减去这个高值。我仍然在寻找一个更好的解决方案来解决这个问题,因为我认为这不是最好的方法,特别是在性能方面。
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 channelhttps://stackoverflow.com/questions/55809286
复制相似问题