|
|
|
@ -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())
|
|
|
|
|
|
|
|
|
|