Caffe2 - Python API
A deep learning, cross platform ML framework
adaptive_weight.py
1 # @package adaptive_weight
2 # Module caffe2.fb.python.layers.adaptive_weight
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 from caffe2.python import core, schema
9 from caffe2.python.layers.layers import ModelLayer
10 import numpy as np
11 '''
12 Implementation of adaptive weighting: https://arxiv.org/pdf/1705.07115.pdf
13 '''
14 
15 
17  def __init__(
18  self,
19  model,
20  input_record,
21  name='adaptive_weight',
22  optimizer=None,
23  weights=None,
24  **kwargs
25  ):
26  super(AdaptiveWeight,
27  self).__init__(model, name, input_record, **kwargs)
29  np.float32, self.get_next_blob_reference('adaptive_weight')
30  )
31  self.data = self.input_record.field_blobs()
32  self.num = len(self.data)
33  # mu_i = log(sigma_i^2)
34  if weights is None:
35  # mu_i is set such that all initial weights are 1. / num
36  initializer = ('ConstantFill', {'value': np.log(self.num / 2.)})
37  else:
38  assert len(weights) == self.num
39  weights = np.array(weights).astype(np.float32)
40  values = np.log(1. / 2. / weights)
41  initializer = (
42  'GivenTensorFill', {
43  'values': values,
44  'dtype': core.DataType.FLOAT
45  }
46  )
47 
48  self.mu = self.create_param(
49  param_name='mu',
50  shape=[self.num],
51  initializer=initializer,
52  optimizer=optimizer,
53  )
54 
55  def concat_data(self, net):
56  reshaped = [
57  net.NextScopedBlob('reshaped_data_%d' % i) for i in range(self.num)
58  ]
59  # coerce shape for single real values
60  for i in range(self.num):
61  net.Reshape(
62  [self.data[i]],
63  [reshaped[i], net.NextScopedBlob('new_shape_%d' % i)],
64  shape=[1]
65  )
66  concated = net.NextScopedBlob('concated_data')
67  net.Concat(
68  reshaped, [concated, net.NextScopedBlob('concated_new_shape')],
69  axis=0
70  )
71  return concated
72 
73  def compute_adaptive_sum(self, x, net):
74  mu_exp = net.NextScopedBlob('mu_exp')
75  net.Exp(self.mu, mu_exp)
76  mu_exp_double = net.NextScopedBlob('mu_exp_double')
77  net.Scale(mu_exp, mu_exp_double, scale=2.0)
78  weighted_x = net.NextScopedBlob('weighted_x')
79  net.Div([x, mu_exp_double], weighted_x)
80  weighted_elements = net.NextScopedBlob('weighted_elements')
81  net.Add([weighted_x, self.mu], weighted_elements)
82  net.SumElements(weighted_elements, self.output_schema())
83 
84  def add_ops(self, net):
85  data = self.concat_data(net)
86  self.compute_adaptive_sum(data, net)
def get_next_blob_reference(self, name)
Definition: layers.py:346
def create_param(self, param_name, shape, initializer, optimizer, ps_param=None, regularizer=None)
Definition: layers.py:331