You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

OptimizerLink.py 3.9 kB

5 years ago
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. from __future__ import absolute_import
  2. import ctypes
  3. from .._base import _LIB
  4. from .. import ndarray as _nd
  5. def add_l2_regularization(param, grad, l2reg, stream=None):
  6. assert isinstance(param, _nd.NDArray)
  7. assert isinstance(grad, (_nd.NDArray, _nd.IndexedSlices))
  8. # not support indexed slices now
  9. if isinstance(grad, _nd.NDArray):
  10. _LIB.AddL2Regularization(param.handle, grad.handle, ctypes.c_float(
  11. l2reg), stream.handle if stream else None)
  12. def sgd_update(param, grad, lr, stream=None):
  13. assert isinstance(param, _nd.NDArray)
  14. assert isinstance(grad, (_nd.NDArray, _nd.IndexedSlices))
  15. if isinstance(grad, _nd.NDArray):
  16. _LIB.SGDOptimizerUpdate(param.handle, grad.handle, ctypes.c_float(
  17. lr), stream.handle if stream else None)
  18. else:
  19. assert isinstance(grad.indices, _nd.NDArray)
  20. assert isinstance(grad.values, _nd.NDArray)
  21. _LIB.SGDOptimizerSparseUpdate(param.handle, grad.indices.handle, grad.values.handle, ctypes.c_float(
  22. lr), stream.handle if stream else None)
  23. def momentum_update(param, grad, velocity, lr, momentum, nesterov, stream=None):
  24. assert isinstance(param, _nd.NDArray)
  25. assert isinstance(grad, (_nd.NDArray, _nd.IndexedSlices))
  26. assert isinstance(velocity, _nd.NDArray)
  27. if isinstance(grad, _nd.NDArray):
  28. _LIB.MomentumOptimizerUpdate(param.handle, grad.handle, velocity.handle, ctypes.c_float(
  29. lr), ctypes.c_float(momentum), ctypes.c_bool(nesterov), stream.handle if stream else None)
  30. else:
  31. assert isinstance(grad.indices, _nd.NDArray)
  32. assert isinstance(grad.values, _nd.NDArray)
  33. _LIB.MomentumOptimizerSparseUpdate(param.handle, grad.indices.handle, grad.values.handle, velocity.handle, ctypes.c_float(
  34. lr), ctypes.c_float(momentum), ctypes.c_bool(nesterov), stream.handle if stream else None)
  35. def adagrad_update(param, grad, accumulation, lr, eps, stream=None):
  36. assert isinstance(param, _nd.NDArray)
  37. assert isinstance(grad, (_nd.NDArray, _nd.IndexedSlices))
  38. assert isinstance(accumulation, _nd.NDArray)
  39. if isinstance(grad, _nd.NDArray):
  40. _LIB.AdaGradOptimizerUpdate(param.handle, grad.handle, accumulation.handle, ctypes.c_float(
  41. lr), ctypes.c_float(eps), stream.handle if stream else None)
  42. else:
  43. grad.deduplicate(stream)
  44. assert isinstance(grad.indices, _nd.NDArray)
  45. assert isinstance(grad.values, _nd.NDArray)
  46. _LIB.AdaGradOptimizerSparseUpdate(param.handle, grad.indices.handle, grad.values.handle, accumulation.handle, ctypes.c_float(
  47. lr), ctypes.c_float(eps), stream.handle if stream else None)
  48. grad.free_deduplicate()
  49. def adam_update(param, grad, expavg, expavgsq, lr, beta1, beta2, beta1t, beta2t, eps, stream=None):
  50. assert isinstance(param, _nd.NDArray)
  51. assert isinstance(grad, (_nd.NDArray, _nd.IndexedSlices))
  52. assert isinstance(expavg, _nd.NDArray)
  53. assert isinstance(expavgsq, _nd.NDArray)
  54. if isinstance(grad, _nd.NDArray):
  55. _LIB.AdamOptimizerUpdate(param.handle, grad.handle, expavg.handle, expavgsq.handle, ctypes.c_float(lr), ctypes.c_float(beta1), ctypes.c_float(beta2),
  56. ctypes.c_float(beta1t), ctypes.c_float(beta2t), ctypes.c_float(eps), stream.handle if stream else None)
  57. else:
  58. grad.deduplicate(stream)
  59. assert isinstance(grad.indices, _nd.NDArray)
  60. assert isinstance(grad.values, _nd.NDArray)
  61. _LIB.AdamOptimizerSparseUpdate(param.handle, grad.indices.handle, grad.values.handle, expavg.handle, expavgsq.handle, ctypes.c_float(lr), ctypes.c_float(beta1), ctypes.c_float(beta2),
  62. ctypes.c_float(beta1t), ctypes.c_float(beta2t), ctypes.c_float(eps), stream.handle if stream else None)
  63. grad.free_deduplicate()