| 307 | return dbreader |
| 308 | |
| 309 | def AddGradientOperators(self, *args, **kwargs): |
| 310 | if self.gradient_ops_added: |
| 311 | raise RuntimeError("You cannot run AddGradientOperators twice.") |
| 312 | self.Validate() |
| 313 | |
| 314 | self.gradient_ops_added = True |
| 315 | self.grad_map = self.net.AddGradientOperators(*args, **kwargs) |
| 316 | self.param_to_grad = self.get_param_to_grad(self.params) |
| 317 | |
| 318 | # Populate ParameterInfo for all parameters if missing |
| 319 | # and add gradient blob information. So optimizers can use it |
| 320 | for param, grad in self.param_to_grad.items(): |
| 321 | param_info = self.get_param_info(param) |
| 322 | if param_info: |
| 323 | param_info.grad = grad |
| 324 | else: |
| 325 | self._parameters_info[param] = parameter_info.ParameterInfo( |
| 326 | param_id=None, |
| 327 | param=param, |
| 328 | grad=grad, |
| 329 | ) |
| 330 | |
| 331 | return self.grad_map |
| 332 | |
| 333 | def get_param_to_grad(self, params): |
| 334 | ''' |