|
- from __future__ import absolute_import
- from .Node import Op
- import ctypes
- import numpy as np
- from .._base import DNNL_LIB
- #from ..cpu_links import dropout as cpu_dropout
- #from ..cpu_links import dropout_gradient as cpu_dropout_gradient
- from ..gpu_links import dropout2d_gradient
- from ..gpu_links import dropout2d
-
-
- class Dropout2dOp(Op):
- def __init__(self, node_in, keep_prob, ctx=None):
- super().__init__(Dropout2dOp, [node_in], ctx)
- self.seed = ctypes.c_ulonglong(0)
- self.mask = None
- self.keep_prob = keep_prob
-
- def compute(self, input_vals, output_val, stream_handle=None, inference=False):
- if inference:
- if self.on_cpu:
- output_val[:] = input_vals[0].asnumpy()
- else:
- input_vals[0].copyto(output_val)
- else:
- if self.on_cpu:
- raise NotImplementedError
- else:
- dropout2d(input_vals[0], 1 - self.keep_prob,
- output_val, self.seed, stream_handle)
-
- def gradient(self, output_grad):
- return [dropout2d_gradient_op(output_grad, self.keep_prob, self, ctx=self.raw_ctx)]
-
- def infer_shape(self, input_shapes):
- return input_shapes[0]
-
-
- class Dropout2d_GradientOp(Op):
- def __init__(self, node_in, keep_prob, forward_node, ctx=None):
- super().__init__(Dropout2d_GradientOp, [node_in], ctx)
- self.forward_node = forward_node
- self.keep_prob = keep_prob
-
- def compute(self, input_vals, output_val, stream_handle=None):
- if self.on_cpu:
- raise NotImplementedError
- else:
- dropout2d_gradient(
- input_vals[0], 1 - self.keep_prob, output_val, self.forward_node.seed, stream_handle)
-
- def gradient(self, output_grad):
- raise NotImplementedError
-
- def infer_shape(self, input_shapes):
- return input_shapes[0]
-
-
- def dropout2d_op(node_in, keep_prob, ctx=None):
- """Drops elements of input variable randomly.
- Parameters:
- ----
- node_in : Node
- Input variable.
- keep_prob : float
- Probability of the results to be kept.
- Returns:
- ----
- A new Node instance created by Op.
- """
- return Dropout2dOp(node_in, keep_prob, ctx=ctx)
-
-
- def dropout2d_gradient_op(node_in, keep_prob, forward_node, ctx=None):
- """Gradient node of dropout2d operation.
- Parameters:
- ----
- node_in : Node
- Input variable.
- keep_prob : float
- Probability of the results to be kept.
- Returns:
- ----
- A new Node instance created by Op.
- """
- return Dropout2d_GradientOp(node_in, keep_prob, forward_node, ctx=ctx)
|