forked from mindspore-Ecosystem/mindspore
modified api name Stack -> Pack, Unstack -> Unpack
This commit is contained in:
parent
cc53ddaeca
commit
0f0f83e292
|
@ -148,8 +148,8 @@ const char kNameSlice[] = "Slice";
|
||||||
const char kNameAddN[] = "AddN";
|
const char kNameAddN[] = "AddN";
|
||||||
const char kNameLess[] = "Less";
|
const char kNameLess[] = "Less";
|
||||||
const char kNameGreater[] = "Greater";
|
const char kNameGreater[] = "Greater";
|
||||||
const char kNameStack[] = "Stack";
|
const char kNamePack[] = "Pack";
|
||||||
const char kNameUnstack[] = "Unstack";
|
const char kNameUnpack[] = "Unpack";
|
||||||
const char kNameMerge[] = "Merge";
|
const char kNameMerge[] = "Merge";
|
||||||
const char kNameGeSwitch[] = "GeSwitch";
|
const char kNameGeSwitch[] = "GeSwitch";
|
||||||
|
|
||||||
|
@ -202,8 +202,8 @@ std::unordered_map<std::string, OpAdapterDescPtr> &DfGraphConvertor::get_adpt_ma
|
||||||
{string(kNameAvgPool), ADPT_DESC(AvgPool)},
|
{string(kNameAvgPool), ADPT_DESC(AvgPool)},
|
||||||
{string(kNameMaxPoolWithArgmax), ADPT_DESC(MaxPoolWithArgmax)},
|
{string(kNameMaxPoolWithArgmax), ADPT_DESC(MaxPoolWithArgmax)},
|
||||||
{string(kNameTopK), ADPT_DESC(TopKV2)},
|
{string(kNameTopK), ADPT_DESC(TopKV2)},
|
||||||
{string(kNameStack), ADPT_DESC(Pack)},
|
{string(kNamePack), ADPT_DESC(Pack)},
|
||||||
{string(kNameUnstack), ADPT_DESC(Unpack)},
|
{string(kNameUnpack), ADPT_DESC(Unpack)},
|
||||||
{string(kNameSplitD), ADPT_DESC(SplitD)},
|
{string(kNameSplitD), ADPT_DESC(SplitD)},
|
||||||
{string(kNameAllReduce), ADPT_DESC(HcomAllReduce)},
|
{string(kNameAllReduce), ADPT_DESC(HcomAllReduce)},
|
||||||
{string(kNameBroadcast), ADPT_DESC(HcomBroadcast)},
|
{string(kNameBroadcast), ADPT_DESC(HcomBroadcast)},
|
||||||
|
|
|
@ -266,26 +266,26 @@ def get_bprop_gather_v2(self):
|
||||||
return bprop
|
return bprop
|
||||||
|
|
||||||
|
|
||||||
@bprop_getters.register(P.Stack)
|
@bprop_getters.register(P.Pack)
|
||||||
def get_bprop_stack(self):
|
def get_bprop_pack(self):
|
||||||
"""Generate bprop for Stack"""
|
"""Generate bprop for Pack"""
|
||||||
axis = self.axis
|
axis = self.axis
|
||||||
|
|
||||||
def bprop(x, out, dout):
|
def bprop(x, out, dout):
|
||||||
stack_grad = P.Unstack(axis)
|
pack_grad = P.Unpack(axis)
|
||||||
out = stack_grad(dout)
|
out = pack_grad(dout)
|
||||||
return (out,)
|
return (out,)
|
||||||
return bprop
|
return bprop
|
||||||
|
|
||||||
|
|
||||||
@bprop_getters.register(P.Unstack)
|
@bprop_getters.register(P.Unpack)
|
||||||
def get_bprop_unstack(self):
|
def get_bprop_unpack(self):
|
||||||
"""Generate bprop for Unstack"""
|
"""Generate bprop for Unpack"""
|
||||||
axis = self.axis
|
axis = self.axis
|
||||||
|
|
||||||
def bprop(x, out, dout):
|
def bprop(x, out, dout):
|
||||||
unstack_grad = P.Stack(axis)
|
unpack_grad = P.Pack(axis)
|
||||||
out = unstack_grad(dout)
|
out = unpack_grad(dout)
|
||||||
return (out,)
|
return (out,)
|
||||||
return bprop
|
return bprop
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ Primitive operator classes.
|
||||||
A collection of operators to build nerual networks or computing functions.
|
A collection of operators to build nerual networks or computing functions.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from .array_ops import (Argmax, Argmin, Cast, ConcatOffset, Concat, Stack, Unstack,
|
from .array_ops import (Argmax, Argmin, Cast, ConcatOffset, Concat, Pack, Unpack,
|
||||||
Diag, DiagPart, DType, ExpandDims, Eye,
|
Diag, DiagPart, DType, ExpandDims, Eye,
|
||||||
Fill, GatherNd, GatherV2, InvertPermutation,
|
Fill, GatherNd, GatherV2, InvertPermutation,
|
||||||
IsInstance, IsSubClass, ArgMaxWithValue, OnesLike, ZerosLike,
|
IsInstance, IsSubClass, ArgMaxWithValue, OnesLike, ZerosLike,
|
||||||
|
@ -112,8 +112,8 @@ __all__ = [
|
||||||
'OneHot',
|
'OneHot',
|
||||||
'GatherV2',
|
'GatherV2',
|
||||||
'Concat',
|
'Concat',
|
||||||
'Stack',
|
'Pack',
|
||||||
'Unstack',
|
'Unpack',
|
||||||
'Tile',
|
'Tile',
|
||||||
'BiasAdd',
|
'BiasAdd',
|
||||||
'Gelu',
|
'Gelu',
|
||||||
|
|
|
@ -1350,8 +1350,8 @@ class Concat(PrimitiveWithInfer):
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
def _get_stack_shape(x_shape, x_type, axis):
|
def _get_pack_shape(x_shape, x_type, axis):
|
||||||
"""for satck output shape"""
|
"""for pack output shape"""
|
||||||
validator.check_type("shape", x_shape, [tuple])
|
validator.check_type("shape", x_shape, [tuple])
|
||||||
validator.check_integer("len of input_x shape", len(x_shape), 0, Rel.GT)
|
validator.check_integer("len of input_x shape", len(x_shape), 0, Rel.GT)
|
||||||
validator.check_subclass("shape0", x_type[0], mstype.tensor)
|
validator.check_subclass("shape0", x_type[0], mstype.tensor)
|
||||||
|
@ -1368,43 +1368,40 @@ def _get_stack_shape(x_shape, x_type, axis):
|
||||||
validator.check('x_type[%d]' % i, x_type[i], 'base', x_type[0])
|
validator.check('x_type[%d]' % i, x_type[i], 'base', x_type[0])
|
||||||
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("Stack evaluator element %d shape in input can not stack with first element" % i)
|
raise ValueError("Pack evaluator element %d shape in input can not pack with first element" % i)
|
||||||
out_shape.insert(axis, N)
|
out_shape.insert(axis, N)
|
||||||
return out_shape
|
return out_shape
|
||||||
|
|
||||||
class Stack(PrimitiveWithInfer):
|
class Pack(PrimitiveWithInfer):
|
||||||
r"""
|
r"""
|
||||||
Stacks a list of rank-`R` tensors into one rank-`(R+1)` tensor.
|
Packs a list of tensors in specified axis.
|
||||||
|
|
||||||
Packs the list of tensors in `input_x` into a tensor with rank one higher than
|
Packs the list of input tensors with the same rank `R`, output is a tensor of rank `(R+1)`.
|
||||||
each tensor in `input_x`, by packing them along the `axis` dimension.
|
|
||||||
Given a list of length `N` of tensors of shape `(A, B, C)`;
|
|
||||||
|
|
||||||
If `axis == 0` then the `output` tensor will have the shape `(N, A, B, C)`.
|
Given input tensors of shape :math:`(x_1, x_2, ..., x_R)`. Set the number of input tensors as `N`.
|
||||||
|
If :math:`0 \le axis`, the output tensor shape is :math:`(x_1, x_2, ..., x_{axis}, N, x_{axis+1}, ..., x_R)`.
|
||||||
If `axis == 1` then the `output` tensor will have the shape `(A, N, B, C)`. Etc.
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
axis (int): The axis to stack along. Negative values wrap around,
|
axis (int): Dimension along which to pack. Default: 0.
|
||||||
so the valid range is [-(R+1), R+1). Default: 0.
|
Negative values wrap around. The range is [-(R+1), R+1).
|
||||||
|
|
||||||
Inputs:
|
Inputs:
|
||||||
- **input_x** (Union[tuple, list]) - A Tuple or list of Tensor objects with the same shape and type.
|
- **input_x** (Union[tuple, list]) - A Tuple or list of Tensor objects with the same shape and type.
|
||||||
|
|
||||||
Outputs:
|
Outputs:
|
||||||
Tensor. A stacked Tensor with the same type as values.
|
Tensor. A packed Tensor with the same type as `input_x`.
|
||||||
|
|
||||||
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))
|
||||||
>>> op = P.Stack()
|
>>> pack = P.Pack()
|
||||||
>>> output = op([data1, data2])
|
>>> output = pack([data1, data2])
|
||||||
[[0, 1], [2, 3]]
|
[[0, 1], [2, 3]]
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@prim_attr_register
|
@prim_attr_register
|
||||||
def __init__(self, axis=0):
|
def __init__(self, axis=0):
|
||||||
"""init Stack"""
|
"""init Pack"""
|
||||||
self.__setattr_flag__ = True
|
self.__setattr_flag__ = True
|
||||||
validator.check_type("axis", axis, [int])
|
validator.check_type("axis", axis, [int])
|
||||||
self.axis = axis
|
self.axis = axis
|
||||||
|
@ -1413,38 +1410,33 @@ class Stack(PrimitiveWithInfer):
|
||||||
x_shape = value['shape']
|
x_shape = value['shape']
|
||||||
x_type = value['dtype']
|
x_type = value['dtype']
|
||||||
self.add_prim_attr('num', len(x_shape))
|
self.add_prim_attr('num', len(x_shape))
|
||||||
all_shape = _get_stack_shape(x_shape, x_type, self.axis)
|
all_shape = _get_pack_shape(x_shape, x_type, self.axis)
|
||||||
out = {'shape': all_shape,
|
out = {'shape': all_shape,
|
||||||
'dtype': x_type[0],
|
'dtype': x_type[0],
|
||||||
'value': None}
|
'value': None}
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
class Unstack(PrimitiveWithInfer):
|
class Unpack(PrimitiveWithInfer):
|
||||||
r"""
|
r"""
|
||||||
Unpacks the given dimension of a rank-`R` tensor into rank-`(R-1)` tensors.
|
Unpacks tensor in specified axis.
|
||||||
|
|
||||||
Unpacks num tensors from value by chipping it along the axis dimension.
|
Unpacks a tensor of rank `R` along axis dimension, output tensors will have rank `(R-1)`.
|
||||||
If num is not specified (the default), it is inferred from value's shape.
|
|
||||||
If value.shape[axis] is not known, ValueError is raised.
|
|
||||||
|
|
||||||
For example, given a tensor of shape (A, B, C, D);
|
Given a tensor of shape :math:`(x_1, x_2, ..., x_R)`. If :math:`0 \le axis`,
|
||||||
|
the shape of tensor in output is :math:`(x_1, x_2, ..., x_{axis}, x_{axis+2}, ..., x_R)`.
|
||||||
|
|
||||||
If axis == 0 then the i'th tensor in output is the slice value[i, :, :, :] and
|
This is the opposite of pack.
|
||||||
each tensor in output will have shape (B, C, D). (Note that the dimension unpacked along is gone, unlike split).
|
|
||||||
|
|
||||||
If axis == 1 then the i'th tensor in output is the slice value[:, i, :, :] and
|
|
||||||
each tensor in output will have shape (A, C, D). Etc.
|
|
||||||
|
|
||||||
This is the opposite of stack.
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
axis (int): The axis to unstack along. Defaults to the first dimension.
|
axis (int): Dimension along which to pack. Default: 0.
|
||||||
Negative values wrap around, so the valid 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)`.
|
||||||
A rank R > 0 Tensor to be unstacked.
|
A rank R > 0 Tensor to be unpacked.
|
||||||
|
|
||||||
Outputs:
|
Outputs:
|
||||||
A tuple of Tensors, the shape of each objects is same.
|
A tuple of Tensors, the shape of each objects is same.
|
||||||
|
@ -1454,15 +1446,15 @@ class Unstack(PrimitiveWithInfer):
|
||||||
or if len(input_x.shape[axis]) not equal to num.
|
or if len(input_x.shape[axis]) not equal to num.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
>>> unstack = P.Unstack()
|
>>> unpack = P.Unpack()
|
||||||
>>> x = Tensor(np.array([[1, 1, 1, 1], [2, 2, 2, 2]]))
|
>>> input_x = Tensor(np.array([[1, 1, 1, 1], [2, 2, 2, 2]]))
|
||||||
>>> output = unstack(x)
|
>>> output = unpack(input_x)
|
||||||
([1, 1, 1, 1], [2, 2, 2, 2])
|
([1, 1, 1, 1], [2, 2, 2, 2])
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@prim_attr_register
|
@prim_attr_register
|
||||||
def __init__(self, axis=0):
|
def __init__(self, axis=0):
|
||||||
"""init Unstack"""
|
"""init Unpack"""
|
||||||
self.__setattr_flag__ = True
|
self.__setattr_flag__ = True
|
||||||
validator.check_type("axis", axis, [int])
|
validator.check_type("axis", axis, [int])
|
||||||
self.axis = axis
|
self.axis = axis
|
||||||
|
@ -1479,7 +1471,7 @@ class Unstack(PrimitiveWithInfer):
|
||||||
validator.check_integer("output_num", output_num, 0, Rel.GT)
|
validator.check_integer("output_num", output_num, 0, Rel.GT)
|
||||||
self.add_prim_attr('num', output_num)
|
self.add_prim_attr('num', output_num)
|
||||||
output_valid_check = x_shape[self.axis] - output_num
|
output_valid_check = x_shape[self.axis] - output_num
|
||||||
validator.check_integer("the dimension which to unstack divides output_num", output_valid_check, 0, Rel.EQ)
|
validator.check_integer("The dimension which to unpack divides output_num", output_valid_check, 0, Rel.EQ)
|
||||||
out_shapes = []
|
out_shapes = []
|
||||||
out_dtypes = []
|
out_dtypes = []
|
||||||
out_shape = x_shape[:self.axis] + x_shape[self.axis + 1:]
|
out_shape = x_shape[:self.axis] + x_shape[self.axis + 1:]
|
||||||
|
|
|
@ -80,9 +80,9 @@ class NetForConcat1(nn.Cell):
|
||||||
return self.concat((x1, x2))
|
return self.concat((x1, x2))
|
||||||
|
|
||||||
|
|
||||||
class NetForStackInput(nn.Cell):
|
class NetForPackInput(nn.Cell):
|
||||||
def __init__(self, op):
|
def __init__(self, op):
|
||||||
super(NetForStackInput, self).__init__()
|
super(NetForPackInput, self).__init__()
|
||||||
self.op = op
|
self.op = op
|
||||||
self.mul = P.Mul()
|
self.mul = P.Mul()
|
||||||
|
|
||||||
|
@ -93,9 +93,9 @@ class NetForStackInput(nn.Cell):
|
||||||
return self.op(t)
|
return self.op(t)
|
||||||
|
|
||||||
|
|
||||||
class NetForUnstackInput(nn.Cell):
|
class NetForUnpackInput(nn.Cell):
|
||||||
def __init__(self, op):
|
def __init__(self, op):
|
||||||
super(NetForUnstackInput, self).__init__()
|
super(NetForUnpackInput, self).__init__()
|
||||||
self.op = op
|
self.op = op
|
||||||
self.mul = P.Mul()
|
self.mul = P.Mul()
|
||||||
|
|
||||||
|
@ -991,33 +991,33 @@ test_case_array_ops = [
|
||||||
Tensor(np.array([1], np.float32)),
|
Tensor(np.array([1], np.float32)),
|
||||||
Tensor(np.array([1], np.float32)))],
|
Tensor(np.array([1], np.float32)))],
|
||||||
'desc_bprop': [[3,]]}),
|
'desc_bprop': [[3,]]}),
|
||||||
('StackV2_0', {
|
('Pack_0', {
|
||||||
'block': NetForStackInput(P.Stack()),
|
'block': NetForPackInput(P.Pack()),
|
||||||
'desc_inputs':[[2, 2], [2, 2], [2, 2]],
|
'desc_inputs':[[2, 2], [2, 2], [2, 2]],
|
||||||
'desc_bprop':[[3, 2, 2]],
|
'desc_bprop':[[3, 2, 2]],
|
||||||
}),
|
}),
|
||||||
('StackV2_1', {
|
('Pack_1', {
|
||||||
'block': NetForStackInput(P.Stack(axis=-2)),
|
'block': NetForPackInput(P.Pack(axis=-2)),
|
||||||
'desc_inputs':[[3, 2, 3], [3, 2, 3], [3, 2, 3]],
|
'desc_inputs':[[3, 2, 3], [3, 2, 3], [3, 2, 3]],
|
||||||
'desc_bprop':[[3, 2, 3, 3]],
|
'desc_bprop':[[3, 2, 3, 3]],
|
||||||
}),
|
}),
|
||||||
('StackV2_2', {
|
('Pack_2', {
|
||||||
'block': NetForStackInput(P.Stack()),
|
'block': NetForPackInput(P.Pack()),
|
||||||
'desc_inputs':[[2, 2]],
|
'desc_inputs':[[2, 2]],
|
||||||
'desc_bprop':[[2, 2, 2]],
|
'desc_bprop':[[2, 2, 2]],
|
||||||
}),
|
}),
|
||||||
('StackV2_3', {
|
('Pack_3', {
|
||||||
'block': NetForStackInput(P.Stack()),
|
'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]],
|
||||||
}),
|
}),
|
||||||
('UnstackV2_0', {
|
('Unpack_0', {
|
||||||
'block': NetForUnstackInput(P.Unstack(axis=0)),
|
'block': NetForUnpackInput(P.Unpack(axis=0)),
|
||||||
'desc_inputs':[[2, 4]],
|
'desc_inputs':[[2, 4]],
|
||||||
'desc_bprop':[[4], [4]],
|
'desc_bprop':[[4], [4]],
|
||||||
}),
|
}),
|
||||||
('UnstackV2_1', {
|
('Unpack_1', {
|
||||||
'block': NetForUnstackInput(P.Unstack(axis=-1)),
|
'block': NetForUnpackInput(P.Unpack(axis=-1)),
|
||||||
'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]],
|
||||||
}),
|
}),
|
||||||
|
|
Loading…
Reference in New Issue