class Dropout:
def __init__(self):
# Set seed for the random numbers
np.random.seed(1234)
rng = np.random.RandomState(1234)
# Generate a theano RandomStreams
self.srng = RandomStreams(rng.randint(999999))
def __dropit(self, weight, drop):
"""
Drops some of the cells of 'weight' matrix based on a binomial representation with prob = drop
# Arguments:
:param weight : Parameter matrix of the model
:type : theano.tensor
:param drop : proportion to dropout from the 'weight'
:type : float32
# Returns: Dropped out matrix
"""
retain_prob = 1 - drop
mask = self.srng.binomial(n=1, p=retain_prob, size=weight.shape, dtype='floatX')
return theano.tensor.cast(weight * mask, theano.config.floatX)
def __dont_dropit(self, weight, drop):
"""
Scale the weight parameters if train = 0
# Arguments:
:param weight : Parameter matrix of the model
:type : theano.tensor
:param drop : proportion to dropout from the 'weight'
:type : float32
# Returns: Scaled Dropped out matrix
"""
return (1 - drop) * theano.tensor.cast(weight, theano.config.floatX)
def dropout_layer(self, weight, drop, train = 1):
"""
Drops some of the cells of 'weight' matrix based on a binomial representation with prob = drop
# Arguments:
:param weight : Parameter matrix of the model
:type : theano.tensor
:param drop : proportion to dropout from the 'weight'
:type : float32
:param train : Flag to switch on/off the dropout
:type : int32
# Returns: Dropped out matrix if train = 1
"""
result = theano.ifelse.ifelse(theano.tensor.eq(train, 1), self.__dropit(weight, drop), self.__dont_dropit(weight, drop))
return result