Implementing dropout from scratch

后端 未结 1 1034
甜味超标
甜味超标 2020-12-06 01:25

This code attempts to utilize a custom implementation of dropout :

%reset -f

import torch
import torch.nn as nn
# import torchvision
# import torchvision.t         


        
1条回答
  •  执笔经年
    2020-12-06 01:56

    It seems I've implemented the dropout function incorrectly?

    np.random.binomial([np.ones((len(input),np.array(list(input.shape))))],1 dropout_percent)[0] * (1.0/(1-self.p))
    

    In fact, the above implementation is known as Inverted Dropout. Inverted Dropout is how Dropout is implemented in practice in the various deep learning frameworks.

    What is inverted dropout?

    Before jump into the inverted dropout, it can be helpful to see how Dropout works for a single neuron:

    Since during train phase a neuron is kept on with probability q (=1-p), during the testing phase we have to emulate the behavior of the ensemble of networks used in the training phase. To this end, the authors suggest scaling the activation function by a factor of q during the test phase in order to use the expected output produced in the training phase as the single output required in the test phase (Section 10, Multiplicative Gaussian Noise). Thus:

    Inverted dropout is a bit different. This approach consists in the scaling of the activations during the training phase, leaving the test phase untouched. The scale factor is the inverse of the keep probability 1/1-p = 1/q, thus:

    Inverted dropout helps to define the model once and just change a parameter (the keep/drop probability) to run train and test on the same model. Direct Dropout, instead, force you to modify the network during the test phase because if you don’t multiply by q the output the neuron will produce values that are higher respect to the one expected by the successive neurons (thus the following neurons can saturate or explode): that’s why Inverted Dropout is the more common implementation.

    References:

    • Dropout Regularization, coursera by Andrew NG

    • What is inverted dropout?

    • Dropout: scaling the activation versus inverting the dropout

    • Analysis of Dropout


    How implement inverted dropout Pytorch?

    class MyDropout(nn.Module):
        def __init__(self, p: float = 0.5):
            super(MyDropout, self).__init__()
            if p < 0 or p > 1:
                raise ValueError("dropout probability has to be between 0 and 1, " "but got {}".format(p))
            self.p = p
    
        def forward(self, X):
            if self.training:
                binomial = torch.distributions.binomial.Binomial(probs=1-self.p)
                return X * binomial.sample(X.size()) * (1.0/(1-self.p))
            return weights
    

    How to implement in Numpy?

    import numpy as np
    
    pKeep = 0.8
    weights = np.ones([1, 5])
    binary_value = np.random.rand(weights.shape[0], weights.shape[1]) < pKeep
    res = np.multiply(weights, binary_value)
    res /= pKeep  # this line is called inverted dropout technique
    print(res)
    

    How to implement in Tensorflow?

    import tensorflow as tf
    tf.enable_eager_execution()
    
    weights = tf.ones(shape=[1, 5])
    keep_prob = 0.8
    random_tensor = keep_prob
    random_tensor += tf.random_uniform(weights.shape)
    # 0. if [keep_prob, 1.0) and 1. if [1.0, 1.0 + keep_prob)
    binary_tensor = tf.floor(random_tensor)
    ret = tf.div(weights, keep_prob) * binary_tensor
    print(ret)
    

    0 讨论(0)
提交回复
热议问题