4 from __future__
import absolute_import
5 from __future__
import division
6 from __future__
import print_function
7 from __future__
import unicode_literals
13 logger = logging.getLogger(__name__)
15 Homotopy Weighting between two weights x, y by doing: alpha x + (1-alpha) y 16 where x is a decreasing scalar parameter ranging from [min, max] (default, [0, 19 Homotopy methods first solves an "easy" problem (one to which the solution is 20 well known), and is gradually transformed into the target problem 29 name=
'homotopy_weight',
38 self).__init__(model, name, input_record, **kwargs)
42 data = self.input_record.field_blobs()
53 assert max_weight > min_weight
54 self.
scale = float(max_weight - min_weight)
55 self.
offset = self.model.add_global_constant(
56 '%s_offset_1dfloat' % self.
name, float(min_weight)
60 def solve_inv_lr_params(self, half_life, quad_life):
64 assert quad_life > 2 * half_life
65 t = float(quad_life) / float(half_life)
66 x = t * (1.0 + np.sqrt(2.0)) / 2.0 - np.sqrt(2.0)
67 gamma = (x - 1.0) / float(half_life)
68 power = np.log(2.0) / np.log(x)
70 'homotopy_weighting: found lr param: gamma=%g, power=%g' %
75 def create_atomic_iter(self):
77 param_name=(
'%s_mutex' % self.
name),
79 initializer=(
'CreateMutex', ),
80 optimizer=self.model.NoOptim,
83 param_name=(
'%s_atomic_iter' % self.
name),
88 'dtype': core.DataType.INT64
91 optimizer=self.model.NoOptim,
95 def update_weight(self, net):
96 alpha = net.NextScopedBlob(
'alpha')
97 beta = net.NextScopedBlob(
'beta')
98 lr = net.NextScopedBlob(
'lr')
99 comp_lr = net.NextScopedBlob(
'complementary_lr')
100 scaled_lr = net.NextScopedBlob(
'scaled_lr')
101 scaled_comp_lr = net.NextScopedBlob(
'scaled_complementary_lr')
112 net.Sub([self.model.global_constants[
'ONE'], lr], [comp_lr])
113 net.Scale([lr], [scaled_lr], scale=self.
scale)
114 net.Scale([comp_lr], [scaled_comp_lr], scale=self.
scale)
115 net.Add([lr, self.
offset], [alpha])
116 net.Add([comp_lr, self.
offset], beta)
119 def add_ops(self, net):
def get_next_blob_reference(self, name)
def solve_inv_lr_params(self, half_life, quad_life)
def create_atomic_iter(self)
def create_param(self, param_name, shape, initializer, optimizer, ps_param=None, regularizer=None)
def update_weight(self, net)