Merge pull request !886 from zhaozhenlong/fix-issues-pack-one-input-errortags/v0.3.0-alpha
| @@ -788,7 +788,7 @@ def get_bprop_atan2(self): | |||||
| def bprop(x, y, out, dout): | def bprop(x, y, out, dout): | ||||
| tmp = dout / (square(x) + square(y)) | tmp = dout / (square(x) + square(y)) | ||||
| dx = tmp * y | |||||
| dy = tmp * (-x) | |||||
| return (dx, dy) | |||||
| bc_dx = tmp * y | |||||
| bc_dy = tmp * (-x) | |||||
| return binop_grad_common(x, y, bc_dx, bc_dy) | |||||
| return bprop | return bprop | ||||
| @@ -669,6 +669,9 @@ class PReLUGrad(PrimitiveWithInfer): | |||||
| r""" | r""" | ||||
| Gradients of PReLU operation. | Gradients of PReLU operation. | ||||
| Note: | |||||
| 1-dimensional input_x is not supported. | |||||
| Inputs: | Inputs: | ||||
| - **y_backprop** (Tensor) - Representing the backprop of the next layer. | - **y_backprop** (Tensor) - Representing the backprop of the next layer. | ||||
| - **input_x** (Tensor) - Should be the input `input_x` of forward operator PRelu. | - **input_x** (Tensor) - Should be the input `input_x` of forward operator PRelu. | ||||
| @@ -683,6 +686,8 @@ class PReLUGrad(PrimitiveWithInfer): | |||||
| pass | pass | ||||
| def infer_shape(self, y_backprop_shape, A_shape, w_shape): | def infer_shape(self, y_backprop_shape, A_shape, w_shape): | ||||
| if len(A_shape) == 1: | |||||
| raise ValueError(f'For \'{self.name}\' input_x rank 1 is not supported.') | |||||
| return y_backprop_shape, w_shape | return y_backprop_shape, w_shape | ||||
| def infer_dtype(self, y_backprop_dtype, A_dtype, w_dtype): | def infer_dtype(self, y_backprop_dtype, A_dtype, w_dtype): | ||||
| @@ -1308,8 +1308,8 @@ class Concat(PrimitiveWithInfer): | |||||
| def _get_pack_shape(x_shape, x_type, axis, prim_name): | def _get_pack_shape(x_shape, x_type, axis, prim_name): | ||||
| """for pack output shape""" | """for pack output shape""" | ||||
| validator.check_value_type("shape", x_shape, [tuple, list], prim_name) | validator.check_value_type("shape", x_shape, [tuple, list], prim_name) | ||||
| validator.check_integer("len of input_x shape", len(x_shape), 0, Rel.GT, prim_name) | |||||
| validator.check_subclass("shape0", x_type[0], mstype.tensor, prim_name) | |||||
| validator.check_integer("len of input_x", len(x_shape), 1, Rel.GT, prim_name) | |||||
| validator.check_subclass("input_x[0]", x_type[0], mstype.tensor, prim_name) | |||||
| validator.check_integer("len of input_x0 shape", len(x_shape[0]), 0, Rel.GT, prim_name) | validator.check_integer("len of input_x0 shape", len(x_shape[0]), 0, Rel.GT, prim_name) | ||||
| rank_base = len(x_shape[0]) | rank_base = len(x_shape[0]) | ||||
| N = len(x_shape) | N = len(x_shape) | ||||
| @@ -1320,7 +1320,7 @@ def _get_pack_shape(x_shape, x_type, axis, prim_name): | |||||
| for i in range(1, N): | for i in range(1, N): | ||||
| v = x_shape[i] | v = x_shape[i] | ||||
| validator.check('len of x_shape[%d]' % i, len(v), 'len of rank_base', rank_base, Rel.EQ, prim_name) | validator.check('len of x_shape[%d]' % i, len(v), 'len of rank_base', rank_base, Rel.EQ, prim_name) | ||||
| validator.check('x_type[%d]' % i, x_type[i], 'base', x_type[0], Rel.EQ, prim_name) | |||||
| validator.check('x_type[%d]' % i, x_type[i], 'base', x_type[0], Rel.EQ, prim_name, TypeError) | |||||
| for j in range(rank_base): | for j in range(rank_base): | ||||
| if v[j] != x_shape[0][j]: | if v[j] != x_shape[0][j]: | ||||
| raise ValueError(f"For \'{prim_name}\' element {i} shape in input can not pack with first element") | raise ValueError(f"For \'{prim_name}\' element {i} shape in input can not pack with first element") | ||||
| @@ -1346,6 +1346,12 @@ class Pack(PrimitiveWithInfer): | |||||
| Outputs: | Outputs: | ||||
| Tensor. A packed Tensor with the same type as `input_x`. | Tensor. A packed Tensor with the same type as `input_x`. | ||||
| Raises: | |||||
| TypeError: If the data types of elements in input_x are not the same. | |||||
| ValueError: If length of input_x is not greater than 1; | |||||
| or if axis is out of the range [-(R+1), R+1); | |||||
| or if the shapes of elements in input_x are not the same. | |||||
| Examples: | Examples: | ||||
| >>> data1 = Tensor(np.array([0, 1]).astype(np.float32)) | >>> data1 = Tensor(np.array([0, 1]).astype(np.float32)) | ||||
| >>> data2 = Tensor(np.array([2, 3]).astype(np.float32)) | >>> data2 = Tensor(np.array([2, 3]).astype(np.float32)) | ||||
| @@ -1386,8 +1392,6 @@ class Unpack(PrimitiveWithInfer): | |||||
| Args: | Args: | ||||
| axis (int): Dimension along which to pack. Default: 0. | axis (int): Dimension along which to pack. Default: 0. | ||||
| Negative values wrap around. The range is [-R, R). | Negative values wrap around. The range is [-R, R). | ||||
| num (int): The number of tensors to be unpacked to. Default : "None". | |||||
| If `num` is not specified, it is inferred from the shape of `input_x`. | |||||
| Inputs: | Inputs: | ||||
| - **input_x** (Tensor) - The shape is :math:`(x_1, x_2, ..., x_R)`. | - **input_x** (Tensor) - The shape is :math:`(x_1, x_2, ..., x_R)`. | ||||
| @@ -1397,8 +1401,7 @@ class Unpack(PrimitiveWithInfer): | |||||
| A tuple of Tensors, the shape of each objects is same. | A tuple of Tensors, the shape of each objects is same. | ||||
| Raises: | Raises: | ||||
| ValueError: If axis is out of the range [-len(input_x.shape()), len(input_x.shape())), | |||||
| or if len(input_x.shape[axis]) not equal to num. | |||||
| ValueError: If axis is out of the range [-len(input_x.shape()), len(input_x.shape())). | |||||
| Examples: | Examples: | ||||
| >>> unpack = P.Unpack() | >>> unpack = P.Unpack() | ||||
| @@ -2087,6 +2087,9 @@ class PReLU(PrimitiveWithInfer): | |||||
| where :math:`x_i` is an element of an channel of the input. | where :math:`x_i` is an element of an channel of the input. | ||||
| Note: | |||||
| 1-dimensional input_x is not supported. | |||||
| Inputs: | Inputs: | ||||
| - **input_x** (Tensor) - Float tensor, representing the output of the preview layer. | - **input_x** (Tensor) - Float tensor, representing the output of the preview layer. | ||||
| - **weight** (Tensor) - Float Tensor, w > 0, there is only two shapes are legitimate, | - **weight** (Tensor) - Float Tensor, w > 0, there is only two shapes are legitimate, | ||||
| @@ -2106,14 +2109,13 @@ class PReLU(PrimitiveWithInfer): | |||||
| input_x_dim = len(input_x_shape) | input_x_dim = len(input_x_shape) | ||||
| weight_dim = len(weight_shape) | weight_dim = len(weight_shape) | ||||
| if input_x_dim == 1: | |||||
| raise ValueError(f'For \'{self.name}\' input_x rank 1 is not supported.') | |||||
| if weight_dim != 1: | if weight_dim != 1: | ||||
| raise ValueError(f'For \'{self.name}\' weight_dim must be 1, while weight_dim is {weight_dim}.') | raise ValueError(f'For \'{self.name}\' weight_dim must be 1, while weight_dim is {weight_dim}.') | ||||
| if input_x_dim == 1 and weight_shape[0] != 1: | |||||
| raise ValueError(f'For \'{self.name}\' when input_x_dim is 1, weight_shape[0] must be 1, ' | |||||
| f'while weight_shape[0] is {weight_shape[0]}.') | |||||
| if input_x_dim != 1 and weight_shape[0] != input_x_shape[1] and weight_shape[0] != 1: | |||||
| if weight_shape[0] != input_x_shape[1] and weight_shape[0] != 1: | |||||
| raise ValueError(f'For \'{self.name}\' channel of input_x and weight must be matched,' | raise ValueError(f'For \'{self.name}\' channel of input_x and weight must be matched,' | ||||
| f' while channel of input_x is {input_x_shape[1]},' | f' while channel of input_x is {input_x_shape[1]},' | ||||
| f' weight_shape[0] is {weight_shape[0]}.') | f' weight_shape[0] is {weight_shape[0]}.') | ||||
| @@ -2556,12 +2558,12 @@ class SparseApplyAdagrad(PrimitiveWithInfer): | |||||
| Tensor, has the same shape and type as `var`. | Tensor, has the same shape and type as `var`. | ||||
| Examples: | Examples: | ||||
| var = Tensor(np.random.random((3, 3)), mindspore.float32) | |||||
| accum = Tensor(np.random.random((3, 3)), mindspore.float32) | |||||
| grad = Tensor(np.random.random((3, 3)), mindspore.float32) | |||||
| indices = Tensor(np.ones((3,), np.int32)) | |||||
| sparse_apply_ada_grad = P.SparseApplyAdagrad(0.5) | |||||
| sparse_apply_ada_grad(var, accum, grad, indices) | |||||
| >>> var = Tensor(np.random.random((3, 3)), mindspore.float32) | |||||
| >>> accum = Tensor(np.random.random((3, 3)), mindspore.float32) | |||||
| >>> grad = Tensor(np.random.random((3, 3)), mindspore.float32) | |||||
| >>> indices = Tensor(np.ones((3,), np.int32)) | |||||
| >>> sparse_apply_ada_grad = P.SparseApplyAdagrad(0.5) | |||||
| >>> sparse_apply_ada_grad(var, accum, grad, indices) | |||||
| """ | """ | ||||
| @prim_attr_register | @prim_attr_register | ||||
| @@ -1033,11 +1033,6 @@ test_case_array_ops = [ | |||||
| 'desc_bprop':[[3, 2, 3, 3]], | 'desc_bprop':[[3, 2, 3, 3]], | ||||
| }), | }), | ||||
| ('Pack_2', { | ('Pack_2', { | ||||
| 'block': NetForPackInput(P.Pack()), | |||||
| 'desc_inputs':[[2, 2]], | |||||
| 'desc_bprop':[[1, 2, 2]], | |||||
| }), | |||||
| ('Pack_3', { | |||||
| 'block': NetForPackInput(P.Pack()), | 'block': NetForPackInput(P.Pack()), | ||||
| 'desc_inputs':[[128, 128], [128, 128]], | 'desc_inputs':[[128, 128], [128, 128]], | ||||
| 'desc_bprop':[[2, 128, 128]], | 'desc_bprop':[[2, 128, 128]], | ||||
| @@ -1052,16 +1047,26 @@ test_case_array_ops = [ | |||||
| 'desc_inputs':[Tensor(np.array([[1, 1, 1]], np.float32))], | 'desc_inputs':[Tensor(np.array([[1, 1, 1]], np.float32))], | ||||
| 'desc_bprop':[[1], [1], [1]], | 'desc_bprop':[[1], [1], [1]], | ||||
| }), | }), | ||||
| ('Diag', { | |||||
| ('Diag_1', { | |||||
| 'block': P.Diag(), | 'block': P.Diag(), | ||||
| 'desc_inputs': [[4]], | 'desc_inputs': [[4]], | ||||
| 'desc_bprop': [[4, 4]], | 'desc_bprop': [[4, 4]], | ||||
| }), | }), | ||||
| ('DiagPart', { | |||||
| ('Diag_2', { | |||||
| 'block': P.Diag(), | |||||
| 'desc_inputs': [[4, 4]], | |||||
| 'desc_bprop': [[4, 4, 4, 4]], | |||||
| }), | |||||
| ('DiagPart_1', { | |||||
| 'block': P.DiagPart(), | 'block': P.DiagPart(), | ||||
| 'desc_inputs': [[4, 4]], | 'desc_inputs': [[4, 4]], | ||||
| 'desc_bprop': [[4]], | 'desc_bprop': [[4]], | ||||
| }), | }), | ||||
| ('DiagPart_2', { | |||||
| 'block': P.DiagPart(), | |||||
| 'desc_inputs': [[4, 4, 4, 4]], | |||||
| 'desc_bprop': [[4, 4]], | |||||
| }), | |||||
| ('SpaceToBatch_1', { | ('SpaceToBatch_1', { | ||||
| 'block': P.SpaceToBatch(2, [[0, 0], [0, 0]]), | 'block': P.SpaceToBatch(2, [[0, 0], [0, 0]]), | ||||
| 'desc_inputs': [[1, 3, 2, 2]], | 'desc_inputs': [[1, 3, 2, 2]], | ||||
| @@ -1200,6 +1205,15 @@ raise_set = [ | |||||
| Tensor(np.ones((2, 2), np.int32)), | Tensor(np.ones((2, 2), np.int32)), | ||||
| Tensor(np.ones((2,), np.float32))), | Tensor(np.ones((2,), np.float32))), | ||||
| 'desc_bprop': [[2, 3]]}), | 'desc_bprop': [[2, 3]]}), | ||||
| ('Pack', { | |||||
| 'block': (NetForPackInput(P.Pack()), {'exception': ValueError}), | |||||
| 'desc_inputs':[[2, 2]], | |||||
| 'desc_bprop':[[1, 2, 2]]}), | |||||
| ('PReLU', { | |||||
| 'block': (P.PReLU(), {'exception': ValueError}), | |||||
| 'desc_inputs':[[2], [1]], | |||||
| 'desc_bprop':[[1]]}), | |||||
| ] | ] | ||||