Caffe2 - Python API
A deep learning, cross platform ML framework
uniform_sampling.py
1 
3 from __future__ import absolute_import
4 from __future__ import division
5 from __future__ import print_function
6 from __future__ import unicode_literals
7 
8 import numpy as np
9 
10 from caffe2.python import core, schema
11 from caffe2.python.layers.layers import LayerParameter, ModelLayer
12 
13 
14 class UniformSampling(ModelLayer):
15  """
16  Uniform sampling `num_samples - len(input_record)` unique elements from the
17  range [0, num_elements). `samples` is the concatenation of input_record and
18  the samples. input_record is expected to be unique.
19  """
20 
21  def __init__(
22  self,
23  model,
24  input_record,
25  num_samples,
26  num_elements,
27  name='uniform_sampling',
28  **kwargs
29  ):
30  super(UniformSampling, self).__init__(
31  model, name, input_record, **kwargs
32  )
33 
34  assert num_elements > 0
35  assert isinstance(input_record, schema.Scalar)
36 
37  self.num_elements = num_elements
38 
39  self.num_samples = model.net.NextScopedBlob(name + "_num_samples")
40  self.params.append(
41  LayerParameter(
42  parameter=self.num_samples,
43  initializer=core.CreateOperator(
44  "GivenTensorInt64Fill",
45  [],
46  self.num_samples,
47  shape=(1, ),
48  values=[num_samples],
49  ),
50  optimizer=model.NoOptim,
51  )
52  )
53 
54  self.sampling_prob = model.net.NextScopedBlob(name + "_prob")
55  self.params.append(
56  LayerParameter(
57  parameter=self.sampling_prob,
58  initializer=core.CreateOperator(
59  "ConstantFill",
60  [],
61  self.sampling_prob,
62  shape=(num_samples, ),
63  value=float(num_samples) / num_elements,
64  dtype=core.DataType.FLOAT
65  ),
66  optimizer=model.NoOptim,
67  )
68  )
69 
71  (
72  'samples', schema.Scalar(
73  np.int32, model.net.NextScopedBlob(name + "_samples")
74  )
75  ),
76  ('sampling_prob', schema.Scalar(np.float32, self.sampling_prob)),
77  )
78 
79  def add_ops(self, net):
80  net.StopGradient(self.sampling_prob, self.sampling_prob)
81 
82  shape = net.Shape([self.input_record()], net.NextScopedBlob("shape"))
83  shape = net.Sub([self.num_samples, shape], shape)
84  samples = net.UniqueUniformFill(
85  [shape, self.input_record()],
86  net.NextScopedBlob("samples"),
87  min=0,
88  max=self.num_elements - 1,
89  input_as_shape=True
90  )
91 
92  net.Concat(
93  [self.input_record(), samples],
94  [self.output_schema.samples(), net.NextScopedBlob("split_info")],
95  axis=0
96  )
97  net.StopGradient(
98  self.output_schema.samples(), self.output_schema.samples()
99  )
def CreateOperator(operator_type, inputs, outputs, name='', control_input=None, device_option=None, arg=None, engine=None, kwargs)
Definition: core.py:259