Mahmud Sabbir
Mahmud Sabbir

Reputation: 391

MinimumPooling in Keras

I have only found MaxPooling2D and AveragePooling2D in keras with tensorflow backend. Have been looking for MinimumPooling2D. This github link suggests to use something like this for minimum pooling (pool2d(-x))

I get an error while using a negative sign before inputs. The following line I use in keras

MaxPooling2D((3, 3), strides=(2, 2), padding='same')(-inputs)

Upvotes: 3

Views: 1911

Answers (2)

asendjasni
asendjasni

Reputation: 1084

Using Keras with TF you can just do it by by using the MaxPooling2D(). You multiply the input feature maps by -1, perform the MaxPooling2D() and then, re-multiply the output by -1 again. Here how to do it:

 min_pool = -tf.keras.layers.MaxPooling2D()(-input_features)

Upvotes: 2

snakile
snakile

Reputation: 54541

It is not sufficient to negate the input argument of the MaxPooling2D layer because the pooled values are going to be negative that way.

I think it's better for you to actually implement a general MinPooling2D class whose pooling function gets the same parameters as Keras MaxPooling2D class and operates analogously. By inheriting from MaxPooling2D, the implementation is very simple:

from keras import layers
from keras import backend as K

class MinPooling2D(layers.MaxPooling2D):


  def __init__(self, pool_size=(2, 2), strides=None, 
               padding='valid', data_format=None, **kwargs):
    super(MaxPooling2D, self).__init__(pool_size, strides, padding,
                                       data_format, **kwargs)

  def pooling_function(inputs, pool_size, strides, padding, data_format):
    return -K.pool2d(-inputs, pool_size, strides, padding, data_format,
                                                         pool_mode='max')

Now you can use this layer just as you would a MaxPooling2D layer. For instance, here's an example of how to use MinPooling2D layer in a simple sequntial convolutional neural network:

from keras import models
from keras import layers

model = models.Sequential()

model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(MinPooling2D(pool_size=(2, 2)))
model.add(layers.Flatten())
model.add(layers.Dense(10, activation='softmax'))

Upvotes: 6

Related Questions