How to define a Keras Custom Layer to add a random value to the output of a Flatten layer (of a CNN) of size (None, 100)?
TL;DR:
class Noise(keras.layers.Layer):
def __init__(self, mean=0, stddev=1.0, *args, **kwargs):
super(Noise, self).__init__(*args, **kwargs)
self.mean = mean
self.stddev = stddev
def call(self, inputs,
training=False # Only add noise in training!
):
if training:
return inputs + tf.random.normal(
inputs.shape,
mean=self.mean,
stddev=self.stddev
) # Add random noise during training
else:
return inputs + tf.fill(
inputs.shape,
self.mean
) # Add mean of random noise during inference
model = keras.Sequential([
layers.Flatten(input_shape=(10,10,1)),
Noise(stddev=.1)
])
model(input_batch,
training=True # Defaults to False.
# Noise is added only in training mode.
)
There is also a built-in keras.layers.GaussianNoise
layer that does same exact thing as my Noise
above.
Several notes to bear in mind when implementing above code:
For any clarification, please don't hesitate to comment! Cheers.