diff --git a/paddle/fluid/operators/shuffle_channel_op.cc b/paddle/fluid/operators/shuffle_channel_op.cc index 9b0631d5ff..9349912e09 100644 --- a/paddle/fluid/operators/shuffle_channel_op.cc +++ b/paddle/fluid/operators/shuffle_channel_op.cc @@ -55,17 +55,12 @@ class ShuffleChannelOpMaker : public framework::OpProtoAndCheckerMaker { AddComment(R"DOC( Shuffle Channel operator - This operator obtains the group convolutional layer with channels shuffled. - Firstly, divide the input channels in each group into several subgroups, - then, feed each group in the next layer with different subgroups. - - According to the paper, "Suppose a convolution layer with G groups - whose output has (G * N) channels, first reshape the output channel dimension into(G,N), - transposing and then flattening it back as the input of next layer. " + This opearator shuffles the channels of input x. + It divide the input channels in each group into several subgroups, + and obtain a new order by selecting element from every subgroup one by one. Shuffle channel operation makes it possible to build more powerful structures with multiple group convolutional layers. - please get more information from the following paper: https://arxiv.org/pdf/1707.01083.pdf )DOC"); diff --git a/python/paddle/fluid/layers/nn.py b/python/paddle/fluid/layers/nn.py index 9ebbb35c07..6f5aeaa527 100644 --- a/python/paddle/fluid/layers/nn.py +++ b/python/paddle/fluid/layers/nn.py @@ -9338,27 +9338,57 @@ def get_tensor_from_selected_rows(x, name=None): def shuffle_channel(x, group, name=None): """ **Shuffle Channel Operator** - This operator obtains the group convolutional layer with channels shuffled. - First, divide the input channels in each group into several subgroups, - then, feed each group in the next layer with different subgroups. - Channel shuffling operation makes it possible to build more powerful structures - with multiple group convolutional layers. + This operator shuffles the channels of input x. + It divide the input channels in each group into :attr:`group` subgroups, + and obtain a new order by selecting element from every subgroup one by one. + + Please refer to the paper + https://arxiv.org/pdf/1707.01083.pdf + .. code-block:: text + Given a 4-D tensor input with the shape (N, C, H, W): + input.shape = (1, 4, 2, 2) + input.data =[[[[0.1, 0.2], + [0.2, 0.3]], + + [[0.3, 0.4], + [0.4, 0.5]], + + [[0.5, 0.6], + [0.6, 0.7]], + + [[0.7, 0.8], + [0.8, 0.9]]]] + Given group: 2 + then we get a 4-D tensor out whth the same shape of input: + out.shape = (1, 4, 2, 2) + out.data = [[[[0.1, 0.2], + [0.2, 0.3]], + + [[0.5, 0.6], + [0.6, 0.7]], + + [[0.3, 0.4], + [0.4, 0.5]], + + [[0.7, 0.8], + [0.8, 0.9]]]] + Args: - x(Variable): The input tensor variable. - group(Integer): The num of group. + x(Variable): The input tensor variable. It should be a 4-D tensor with shape [N, C, H, W] + group(int): Indicating the conuts of subgroups, It should divide the number of channels. Returns: - Variable: channels shuffled tensor variable. + out(Variable): the channels shuffling result is a tensor variable with the + same shape and same type as the input. Raises: ValueError: If group is not an int type variable. Examples: .. code-block:: python - - out = fluid.layers.shuffle_channel(x=group_conv,group=4) - + input = fluid.layers.data(name='input', shape=[1,4,2,2], dtype='float32') + out = fluid.layers.shuffle_channel(x=input, group=2) """ helper = LayerHelper("shuffle_channel", **locals())