Caffe2 - Python API
A deep learning, cross platform ML framework
optimizer_test_util.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 import numpy as np
8 from caffe2.python import core, workspace, cnn
9 
10 
11 class OptimizerTestBase(object):
12  """
13  This is an abstract base class.
14  Don't inherit from unittest.TestCase, and don't name it 'Test*'.
15  Do, however, do these things in classes which inherit from this.
16  """
17 
18  def testDense(self):
19  perfect_model = np.array([2, 6, 5, 0, 1]).astype(np.float32)
20  np.random.seed(123) # make test deterministic
21  data = np.random.randint(
22  2,
23  size=(20, perfect_model.size)).astype(np.float32)
24  label = np.dot(data, perfect_model)[:, np.newaxis]
25 
26  model = cnn.CNNModelHelper("NCHW", name="test")
27  out = model.FC(
28  'data', 'fc', perfect_model.size, 1, ('ConstantFill', {}),
29  ('ConstantFill', {}), axis=0
30  )
31  sq = model.SquaredL2Distance([out, 'label'])
32  loss = model.AveragedLoss(sq, "avg_loss")
33  grad_map = model.AddGradientOperators([loss])
34  self.assertIsInstance(grad_map['fc_w'], core.BlobReference)
35  optimizer = self.build_optimizer(model)
36 
37  workspace.FeedBlob('data', data[0])
38  workspace.FeedBlob('label', label[0])
39  workspace.RunNetOnce(model.param_init_net)
40  workspace.CreateNet(model.net, True)
41  for _ in range(2000):
42  idx = np.random.randint(data.shape[0])
43  workspace.FeedBlob('data', data[idx])
44  workspace.FeedBlob('label', label[idx])
45  workspace.RunNet(model.net.Proto().name)
46 
47  np.testing.assert_allclose(
48  perfect_model[np.newaxis, :],
49  workspace.FetchBlob('fc_w'),
50  atol=1e-2
51  )
52  self.check_optimizer(optimizer)
53 
54  def testSparse(self):
55  # to test duplicated indices we assign two indices to each weight and
56  # thus each weight might count once or twice
57  DUPLICATION = 2
58  perfect_model = np.array([2, 6, 5, 0, 1]).astype(np.float32)
59  np.random.seed(123) # make test deterministic
60  data = np.random.randint(
61  2,
62  size=(20, perfect_model.size * DUPLICATION)).astype(np.float32)
63  label = np.dot(data, np.repeat(perfect_model, DUPLICATION))
64 
65  model = cnn.CNNModelHelper("NCHW", name="test")
66  # imitate what model wrapper does
67  w = model.param_init_net.ConstantFill(
68  [], 'w', shape=[perfect_model.size], value=0.0)
69  model.params.append(w)
70  picked = model.net.Gather([w, 'indices'], 'gather')
71  out = model.ReduceFrontSum(picked, 'sum')
72 
73  sq = model.SquaredL2Distance([out, 'label'])
74  loss = model.AveragedLoss(sq, "avg_loss")
75  grad_map = model.AddGradientOperators([loss])
76  self.assertIsInstance(grad_map['w'], core.GradientSlice)
77  optimizer = self.build_optimizer(model)
78 
79  workspace.CreateBlob('indices')
80  workspace.CreateBlob('label')
81 
82  for indices_type in [np.int32, np.int64]:
83  workspace.RunNetOnce(model.param_init_net)
84  workspace.CreateNet(model.net, True)
85  for _ in range(2000):
86  idx = np.random.randint(data.shape[0])
87  # transform into indices of binary features
88  indices = np.repeat(np.arange(perfect_model.size),
89  DUPLICATION)[data[idx] == 1]
90  if indices.size == 0:
91  continue
93  'indices',
94  indices.reshape((indices.size,)).astype(indices_type)
95  )
96  workspace.FeedBlob('label',
97  np.array(label[idx]).astype(np.float32))
98  workspace.RunNet(model.net.Proto().name)
99 
100  np.testing.assert_allclose(
101  perfect_model,
102  workspace.FetchBlob('w'),
103  atol=1e-2
104  )
105  self.check_optimizer(optimizer)
def RunNet(name, num_iter=1)
Definition: workspace.py:164
def RunNetOnce(net)
Definition: workspace.py:160
def FeedBlob(name, arr, device_option=None)
Definition: workspace.py:229
def CreateNet(net, overwrite=False, input_blobs=None)
Definition: workspace.py:140
def FetchBlob(name)
Definition: workspace.py:276