Search code examples
pythonkeraspaddingconv-neural-networkzero-padding

Reflection padding Conv2D


I'm using keras to build a convolutional neural network for image segmentation and I want to use "reflection padding" instead of padding "same" but I cannot find a way to to do it in keras.

inputs = Input((num_channels, img_rows, img_cols))
conv1=Conv2D(32,3,padding='same',kernel_initializer='he_uniform',data_format='channels_first')(inputs)

Is there a way to implement a reflection layer and insert it in a keras model ?


Solution

  • Found the solution! We have only to create a new class that takes a layer as input and use tensorflow predefined function to do it.

    import tensorflow as tf
    from keras.engine.topology import Layer
    from keras.engine import InputSpec
    
    class ReflectionPadding2D(Layer):
        def __init__(self, padding=(1, 1), **kwargs):
            self.padding = tuple(padding)
            self.input_spec = [InputSpec(ndim=4)]
            super(ReflectionPadding2D, self).__init__(**kwargs)
    
        def get_output_shape_for(self, s):
            """ If you are using "channels_last" configuration"""
            return (s[0], s[1] + 2 * self.padding[0], s[2] + 2 * self.padding[1], s[3])
    
        def call(self, x, mask=None):
            w_pad,h_pad = self.padding
            return tf.pad(x, [[0,0], [h_pad,h_pad], [w_pad,w_pad], [0,0] ], 'REFLECT')
    
    # a little Demo
    inputs = Input((img_rows, img_cols, num_channels))
    padded_inputs= ReflectionPadding2D(padding=(1,1))(inputs)
    conv1 = Conv2D(32, 3, padding='valid', kernel_initializer='he_uniform',
                   data_format='channels_last')(padded_inputs)