Merge pull request !71 from zhangzheng/sparse_acosh_floormodtags/v0.2.0-alpha
| @@ -171,6 +171,8 @@ const char kNameAbsGrad[] = "AbsGrad"; | |||||
| const char kNameBinaryCrossEntropy[] = "BinaryCrossEntropy"; | const char kNameBinaryCrossEntropy[] = "BinaryCrossEntropy"; | ||||
| const char kNameBinaryCrossEntropyGrad[] = "BinaryCrossEntropyGrad"; | const char kNameBinaryCrossEntropyGrad[] = "BinaryCrossEntropyGrad"; | ||||
| const char kNameSparseApplyAdagrad[] = "SparseApplyAdagrad"; | const char kNameSparseApplyAdagrad[] = "SparseApplyAdagrad"; | ||||
| const char kNameAcosh[] = "Acosh"; | |||||
| const char kNameFloorMod[] = "FloorMod"; | |||||
| const char kNameSpaceToDepth[] = "SpaceToDepth"; | const char kNameSpaceToDepth[] = "SpaceToDepth"; | ||||
| const char kNameDepthToSpace[] = "DepthToSpace"; | const char kNameDepthToSpace[] = "DepthToSpace"; | ||||
| const char kNameSign[] = "Sign"; | const char kNameSign[] = "Sign"; | ||||
| @@ -360,6 +362,8 @@ std::unordered_map<std::string, OpAdapterDescPtr> &DfGraphConvertor::get_adpt_ma | |||||
| {string(kNameBinaryCrossEntropy), ADPT_DESC(BinaryCrossEntropy)}, | {string(kNameBinaryCrossEntropy), ADPT_DESC(BinaryCrossEntropy)}, | ||||
| {string(kNameBinaryCrossEntropyGrad), ADPT_DESC(BinaryCrossEntropyGrad)}, | {string(kNameBinaryCrossEntropyGrad), ADPT_DESC(BinaryCrossEntropyGrad)}, | ||||
| {string(kNameSparseApplyAdagrad), ADPT_DESC(SparseApplyAdagradD)}, | {string(kNameSparseApplyAdagrad), ADPT_DESC(SparseApplyAdagradD)}, | ||||
| {string(kNameAcosh), ADPT_DESC(Acosh)}, | |||||
| {string(kNameFloorMod), ADPT_DESC(FloorMod)}, | |||||
| {string(kNameSpaceToDepth), ADPT_DESC(SpaceToDepth)}, | {string(kNameSpaceToDepth), ADPT_DESC(SpaceToDepth)}, | ||||
| {string(kNameDepthToSpace), ADPT_DESC(DepthToSpace)}, | {string(kNameDepthToSpace), ADPT_DESC(DepthToSpace)}, | ||||
| {string(kNameSign), ADPT_DESC(Sign)}, | {string(kNameSign), ADPT_DESC(Sign)}, | ||||
| @@ -357,6 +357,11 @@ INPUT_MAP(AcosGrad) = {{1, INPUT_DESC(y)}, {2, INPUT_DESC(dy)}}; | |||||
| ATTR_MAP(AcosGrad) = EMPTY_ATTR_MAP; | ATTR_MAP(AcosGrad) = EMPTY_ATTR_MAP; | ||||
| OUTPUT_MAP(AcosGrad) = {{0, OUTPUT_DESC(z)}}; | OUTPUT_MAP(AcosGrad) = {{0, OUTPUT_DESC(z)}}; | ||||
| // Acosh | |||||
| INPUT_MAP(Acosh) = {{1, INPUT_DESC(x)}}; | |||||
| ATTR_MAP(Acosh) = EMPTY_ATTR_MAP; | |||||
| OUTPUT_MAP(Acosh) = {{0, OUTPUT_DESC(y)}}; | |||||
| // Floor | // Floor | ||||
| INPUT_MAP(Floor) = {{1, INPUT_DESC(x)}}; | INPUT_MAP(Floor) = {{1, INPUT_DESC(x)}}; | ||||
| ATTR_MAP(Floor) = EMPTY_ATTR_MAP; | ATTR_MAP(Floor) = EMPTY_ATTR_MAP; | ||||
| @@ -367,6 +372,11 @@ INPUT_MAP(FloorDiv) = {{1, INPUT_DESC(x1)}, {2, INPUT_DESC(x2)}}; | |||||
| ATTR_MAP(FloorDiv) = EMPTY_ATTR_MAP; | ATTR_MAP(FloorDiv) = EMPTY_ATTR_MAP; | ||||
| OUTPUT_MAP(FloorDiv) = {{0, OUTPUT_DESC(y)}}; | OUTPUT_MAP(FloorDiv) = {{0, OUTPUT_DESC(y)}}; | ||||
| // FloorMod | |||||
| INPUT_MAP(FloorMod) = {{1, INPUT_DESC(x1)}, {2, INPUT_DESC(x2)}}; | |||||
| ATTR_MAP(FloorMod) = EMPTY_ATTR_MAP; | |||||
| OUTPUT_MAP(FloorMod) = {{0, OUTPUT_DESC(y)}}; | |||||
| // Sin | // Sin | ||||
| INPUT_MAP(Sin) = {{1, INPUT_DESC(x)}}; | INPUT_MAP(Sin) = {{1, INPUT_DESC(x)}}; | ||||
| ATTR_MAP(Sin) = EMPTY_ATTR_MAP; | ATTR_MAP(Sin) = EMPTY_ATTR_MAP; | ||||
| @@ -324,11 +324,15 @@ DECLARE_OP_USE_OUTPUT(Acos) | |||||
| DECLARE_OP_ADAPTER(AcosGrad) | DECLARE_OP_ADAPTER(AcosGrad) | ||||
| DECLARE_OP_USE_OUTPUT(AcosGrad) | DECLARE_OP_USE_OUTPUT(AcosGrad) | ||||
| DECLARE_OP_ADAPTER(Acosh) | |||||
| DECLARE_OP_USE_OUTPUT(Acosh) | |||||
| DECLARE_OP_ADAPTER(Floor) | DECLARE_OP_ADAPTER(Floor) | ||||
| DECLARE_OP_USE_OUTPUT(Floor) | DECLARE_OP_USE_OUTPUT(Floor) | ||||
| DECLARE_OP_ADAPTER(FloorDiv) | DECLARE_OP_ADAPTER(FloorDiv) | ||||
| DECLARE_OP_USE_OUTPUT(FloorDiv) | DECLARE_OP_USE_OUTPUT(FloorDiv) | ||||
| DECLARE_OP_ADAPTER(FloorMod) | |||||
| DECLARE_OP_USE_OUTPUT(FloorMod) | |||||
| DECLARE_OP_ADAPTER(Sin) | DECLARE_OP_ADAPTER(Sin) | ||||
| DECLARE_OP_USE_OUTPUT(Sin) | DECLARE_OP_USE_OUTPUT(Sin) | ||||
| DECLARE_OP_ADAPTER(Exp) | DECLARE_OP_ADAPTER(Exp) | ||||
| @@ -450,7 +454,6 @@ DECLARE_OP_USE_INPUT_ATTR(ApplyRMSPropD) | |||||
| DECLARE_OP_USE_OUTPUT(ApplyRMSPropD) | DECLARE_OP_USE_OUTPUT(ApplyRMSPropD) | ||||
| DECLARE_OP_ADAPTER(ApplyCenteredRMSProp) | DECLARE_OP_ADAPTER(ApplyCenteredRMSProp) | ||||
| DECLARE_OP_USE_OUTPUT(ApplyCenteredRMSProp) | DECLARE_OP_USE_OUTPUT(ApplyCenteredRMSProp) | ||||
| #ifdef ENABLE_GE | #ifdef ENABLE_GE | ||||
| DECLARE_OP_ADAPTER(Print) | DECLARE_OP_ADAPTER(Print) | ||||
| DECLARE_OP_USE_DYN_INPUT(Print) | DECLARE_OP_USE_DYN_INPUT(Print) | ||||
| @@ -251,6 +251,20 @@ def get_bprop_floordiv(self): | |||||
| return bprop | return bprop | ||||
| @bprop_getters.register(P.FloorMod) | |||||
| def get_bprop_floormod(self): | |||||
| """Grad definition for `FloorMod` operation.""" | |||||
| div_op = P.FloorMod() | |||||
| neg = P.Neg() | |||||
| mul_op = P.Mul() | |||||
| def bprop(x, y, out, dout): | |||||
| bc_x = div_op(dout, y) | |||||
| bc_y = neg(mul_op(bc_x, out)) | |||||
| return binop_grad_common(x, y, bc_x, bc_y) | |||||
| return bprop | |||||
| @bprop_getters.register(P.Square) | @bprop_getters.register(P.Square) | ||||
| def get_bprop_square(self): | def get_bprop_square(self): | ||||
| """Grad definition for `Square` operation.""" | """Grad definition for `Square` operation.""" | ||||
| @@ -690,6 +704,17 @@ def get_bprop_acos(self): | |||||
| return bprop | return bprop | ||||
| @bprop_getters.register(P.Acosh) | |||||
| def get_bprop_acosh(self): | |||||
| """Grad definition for `Acosh` operation.""" | |||||
| input_grad = G.AcoshGrad() | |||||
| def bprop(x, out, dout): | |||||
| dx = input_grad(x, dout) | |||||
| return (dx,) | |||||
| return bprop | |||||
| @bprop_getters.register(P.Abs) | @bprop_getters.register(P.Abs) | ||||
| def get_bprop_abs(self): | def get_bprop_abs(self): | ||||
| """Grad definition for `Abs` operation.""" | """Grad definition for `Abs` operation.""" | ||||
| @@ -39,7 +39,7 @@ from .control_ops import ControlDepend, GeSwitch, Merge | |||||
| from .inner_ops import ScalarCast | from .inner_ops import ScalarCast | ||||
| from .math_ops import (Abs, ACos, AddN, AssignAdd, AssignSub, Atan2, BatchMatMul, | from .math_ops import (Abs, ACos, AddN, AssignAdd, AssignSub, Atan2, BatchMatMul, | ||||
| ReduceMax, ReduceMin, ReduceMean, ReduceSum, ReduceAll, ReduceProd, CumProd, | ReduceMax, ReduceMin, ReduceMean, ReduceSum, ReduceAll, ReduceProd, CumProd, | ||||
| Cos, Div, Equal, EqualCount, Exp, Floor, FloorDiv, | |||||
| Cos, Div, Equal, EqualCount, Exp, Floor, FloorDiv, FloorMod, Acosh, | |||||
| Greater, GreaterEqual, Less, LessEqual, Log, LogicalAnd, | Greater, GreaterEqual, Less, LessEqual, Log, LogicalAnd, | ||||
| LogicalNot, LogicalOr, MatMul, Maximum, | LogicalNot, LogicalOr, MatMul, Maximum, | ||||
| Minimum, Mul, Neg, NMSWithMask, NotEqual, | Minimum, Mul, Neg, NMSWithMask, NotEqual, | ||||
| @@ -205,6 +205,8 @@ __all__ = [ | |||||
| 'Log', | 'Log', | ||||
| 'SigmoidCrossEntropyWithLogits', | 'SigmoidCrossEntropyWithLogits', | ||||
| 'FloorDiv', | 'FloorDiv', | ||||
| 'FloorMod', | |||||
| 'Acosh', | |||||
| "PReLU", | "PReLU", | ||||
| "Cos", | "Cos", | ||||
| "ACos", | "ACos", | ||||
| @@ -1183,6 +1183,62 @@ class Floor(PrimitiveWithInfer): | |||||
| return x_dtype | return x_dtype | ||||
| class FloorMod(_MathBinaryOp): | |||||
| """ | |||||
| Compute element-wise remainder of division. | |||||
| The inputs must be two tensors or one tensor and one scalar. | |||||
| When the inputs are two tensors, the shapes of them could be broadcast, | |||||
| and the data types of them should be same. | |||||
| When the inputs are one tensor and one scalar, the scalar cannot be a parameter, only can be a constant, | |||||
| and the type of the scalar is the same as the data type of the tensor. | |||||
| Inputs: | |||||
| - **input_x** (Union[Tensor, Number]) - The first input is a tensor whose data type is number or a number. | |||||
| - **input_y** (Union[Tensor, Number]) - The second input is a tensor whose data type is same as 'input_x' or | |||||
| a number. | |||||
| Outputs: | |||||
| Tensor, the shape is same as the shape after broadcasting, and the data type is same as 'input_x'. | |||||
| Examples: | |||||
| >>> input_x = Tensor(np.array([2, 4, -1]), mindspore.int32) | |||||
| >>> input_y = Tensor(np.array([3, 3, 3]), mindspore.int32) | |||||
| >>> floor_mod = FloorMod() | |||||
| >>> floor_mod(input_x, input_y) | |||||
| [2, 1, 2] | |||||
| """ | |||||
| class Acosh(PrimitiveWithInfer): | |||||
| """ | |||||
| Compute inverse hyperbolic cosine of x element-wise. | |||||
| Inputs: | |||||
| - **input_x** (Tensor) - The shape of tensor is :math:`(x_1, x_2, ..., x_R)`. | |||||
| Outputs: | |||||
| Tensor, has the same shape as `input_x`. | |||||
| Examples: | |||||
| >>> acosh = Acosh() | |||||
| >>> X = Tensor(np.array([1.0, 1.5, 3.0, 100.0]), ms.float32) | |||||
| >>> output = acosh(X) | |||||
| """ | |||||
| @prim_attr_register | |||||
| def __init__(self): | |||||
| """init Acosh""" | |||||
| def infer_shape(self, x): | |||||
| return x | |||||
| def infer_dtype(self, x): | |||||
| validator.check_subclass("x_dtype", x, mstype.tensor) | |||||
| validator.check_typename('x_dtype', x, mstype.number_type) | |||||
| return x | |||||
| class _LogicBinaryOp(_BinaryOp): | class _LogicBinaryOp(_BinaryOp): | ||||
| """ | """ | ||||
| Define logic binary operators. | Define logic binary operators. | ||||
| @@ -2395,4 +2395,4 @@ class ApplyFtrl(PrimitiveWithInfer): | |||||
| validator.check_typename("l1", l1_type,[mstype.float16, mstype.float32]) | validator.check_typename("l1", l1_type,[mstype.float16, mstype.float32]) | ||||
| validator.check_typename("l2", l2_type,[mstype.float16, mstype.float32]) | validator.check_typename("l2", l2_type,[mstype.float16, mstype.float32]) | ||||
| validator.check_typename("lr_power", lr_power_type,[mstype.float16, mstype.float32]) | validator.check_typename("lr_power", lr_power_type,[mstype.float16, mstype.float32]) | ||||
| return var_type | |||||
| return var_type | |||||
| @@ -219,6 +219,10 @@ test_case_math_ops = [ | |||||
| 'block': P.ACos(), | 'block': P.ACos(), | ||||
| 'desc_inputs': [[2, 3]], | 'desc_inputs': [[2, 3]], | ||||
| 'desc_bprop': [[2, 3]]}), | 'desc_bprop': [[2, 3]]}), | ||||
| ('Acosh', { | |||||
| 'block': P.Acosh(), | |||||
| 'desc_inputs': [Tensor(np.random.rand(4).astype(np.float16))], | |||||
| 'skip': ['backward']}), | |||||
| ('Sin', { | ('Sin', { | ||||
| 'block': P.Sin(), | 'block': P.Sin(), | ||||
| 'desc_inputs': [[2, 3]], | 'desc_inputs': [[2, 3]], | ||||
| @@ -301,6 +305,11 @@ test_case_math_ops = [ | |||||
| 'desc_inputs': [Tensor(np.random.rand(4).astype(np.float16)), | 'desc_inputs': [Tensor(np.random.rand(4).astype(np.float16)), | ||||
| Tensor(np.random.rand(4).astype(np.float16))], | Tensor(np.random.rand(4).astype(np.float16))], | ||||
| 'skip': ['backward']}), | 'skip': ['backward']}), | ||||
| ('FloorMod', { | |||||
| 'block': P.FloorMod(), | |||||
| 'desc_inputs': [Tensor(np.random.rand(4).astype(np.float16)), | |||||
| Tensor(np.random.rand(4).astype(np.float16))], | |||||
| 'skip': ['backward']}), | |||||
| ('identity', { | ('identity', { | ||||
| 'block': ops.functional.identity, | 'block': ops.functional.identity, | ||||
| 'desc_inputs': [[2, 2]], | 'desc_inputs': [[2, 2]], | ||||