Class: Chainer::Functions::Noise::Dropout

Inherits:
Chainer::FunctionNode show all
Defined in:
lib/chainer/functions/noise/dropout.rb

Instance Attribute Summary collapse

Attributes inherited from Chainer::FunctionNode

#inputs, #outputs, #rank

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Chainer::FunctionNode

#apply, #backward_accumulate, #forward_cpu, #get_retained_inputs, #get_retained_outputs, #label, #output_data, #retain_inputs, #retain_outputs, #unchain

Constructor Details

#initialize(dropout_ratio) ⇒ Dropout

Returns a new instance of Dropout.



19
20
21
22
23
24
# File 'lib/chainer/functions/noise/dropout.rb', line 19

def initialize(dropout_ratio)
  if dropout_ratio < 0 || dropout_ratio >= 1.0
    raise 'dropout_ratio must be in the range [0, 1)'
  end
  @dropout_ratio = dropout_ratio
end

Instance Attribute Details

#maskObject (readonly)

Returns the value of attribute mask.



5
6
7
# File 'lib/chainer/functions/noise/dropout.rb', line 5

def mask
  @mask
end

Class Method Details

.dropout(x, ratio: 0.5) ⇒ Chainer::Variable

Drops elements of input variable randomly.

This function drops input elements randomly with probability ‘ratio` and scales the remaining elements by factor `1 / (1 - ratio)`. In testing mode, it does nothing and just returns `x`.

Parameters:

  • x (Chainer::Variable)

    Input variable.

  • ratio (float) (defaults to: 0.5)

    Dropout ratio. The “ratio“ must be ‘0.0 <= ratio < 1.0`.

Returns:



15
16
17
# File 'lib/chainer/functions/noise/dropout.rb', line 15

def self.dropout(x, ratio: 0.5)
  Chainer.configuration.train ? self.new(ratio).apply([x])[0] : Chainer::Variable.as_variable(x)
end

Instance Method Details

#backward(x, gy) ⇒ Object



38
39
40
# File 'lib/chainer/functions/noise/dropout.rb', line 38

def backward(x, gy)
  DropoutGrad.new(@mask).apply(gy)
end

#forward(x) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/chainer/functions/noise/dropout.rb', line 26

def forward(x)
  unless self.instance_variable_defined?(:@mask)
    scale = x[0].class[*[1.0 / (1 - @dropout_ratio)]][0]
    flag = x[0].class.new(*x[0].shape).rand >= @dropout_ratio

    @mask = x[0].class.zeros(*x[0].shape)
    @mask[flag] = 1
    @mask *= scale
  end
  [x[0] * @mask]
end