Source code for teras._src.layers.mixup
import keras
from keras import random, ops
from teras._src.api_export import teras_export
[docs]
@teras_export("teras.layers.MixUp")
class MixUp(keras.layers.Layer):
"""
MixUp is a regularization layer proposed by Hongyi Zhang et al.
in the paper,
mixup: BEYOND EMPIRICAL RISK MINIMIZATION
It was originally proposed for image data but here it has been
adapted for Tabular data.
Reference(s):
https://arxiv.org/abs/1710.09412
Args:
alpha: float, Parameter for the Beta distribution to sample
`lambda_` from which is used to interpolate samples.
lambda_seed: int, seed for sampling `lambda_` value from beta
distribution. Defaults to 1337
shuffle_seed: int, seed for randomly shuffling inputs.
Defaults to 1999
"""
[docs]
def __init__(self,
alpha: float = 1.,
lambda_seed: int = 1337,
shuffle_seed: int = 1999,
**kwargs):
super().__init__(**kwargs)
self.alpha = alpha
self.lambda_seed = lambda_seed
self._lambda_seed_gen = random.SeedGenerator(self.lambda_seed)
self.shuffle_seed = shuffle_seed
self._shuffle_seed_gen = random.SeedGenerator(self.shuffle_seed)
def build(self, input_shape):
# there's nothing to build lol
pass
def call(self, inputs):
# Sample lambda_
lambda_ = ops.squeeze(random.beta(shape=(1,),
alpha=self.alpha,
beta=self.alpha,
seed=self._lambda_seed_gen))
# For each data sample select a partner to mix it with at random.
# To efficiently achieve this, we can just shuffle the data
random_partners = random.shuffle(inputs,
axis=0,
seed=self._shuffle_seed_gen)
inputs_mixedup = (lambda_ * inputs) + (1 - lambda_) * random_partners
return inputs_mixedup
def compute_output_shape(self, input_shape):
return input_shape
def get_config(self):
config = super().get_config()
config.update({
"alpha": self.alpha,
"lambda_seed": self.lambda_seed,
"shuffle_seed": self.shuffle_seed,
})
return config