| 160 | |
| 161 | |
| 162 | class LinearDecay(D.learning_rate_scheduler.LearningRateDecay): |
| 163 | def __init__(self, |
| 164 | learning_rate, |
| 165 | warmup_steps, |
| 166 | decay_steps, |
| 167 | end_learning_rate=0, |
| 168 | power=1.0, |
| 169 | cycle=False, |
| 170 | begin=0, |
| 171 | step=1, |
| 172 | dtype='float32'): |
| 173 | super(LinearDecay, self).__init__(begin, step, dtype) |
| 174 | self.learning_rate = learning_rate |
| 175 | self.warmup_steps = warmup_steps |
| 176 | self.decay_steps = decay_steps |
| 177 | self.end_learning_rate = end_learning_rate |
| 178 | self.power = power |
| 179 | self.cycle = cycle |
| 180 | |
| 181 | def step(self): |
| 182 | if self.step_num < self.warmup_steps: |
| 183 | decayed_lr = self.learning_rate * (self.step_num / |
| 184 | self.warmup_steps) |
| 185 | decayed_lr = self.create_lr_var(decayed_lr) |
| 186 | else: |
| 187 | tmp_step_num = self.step_num |
| 188 | tmp_decay_steps = self.decay_steps |
| 189 | if self.cycle: |
| 190 | div_res = fluid.layers.ceil( |
| 191 | self.create_lr_var(tmp_step_num / float(self.decay_steps))) |
| 192 | if tmp_step_num == 0: |
| 193 | div_res = self.create_lr_var(1.0) |
| 194 | tmp_decay_steps = self.decay_steps * div_res |
| 195 | else: |
| 196 | tmp_step_num = self.create_lr_var( |
| 197 | tmp_step_num |
| 198 | if tmp_step_num < self.decay_steps else self.decay_steps) |
| 199 | decayed_lr = (self.learning_rate - self.end_learning_rate) * \ |
| 200 | ((1 - tmp_step_num / tmp_decay_steps) ** self.power) + self.end_learning_rate |
| 201 | |
| 202 | return decayed_lr |
| 203 | |