nets.py 4.0 KB
Newer Older
1
import layers
F
fengjiayi 已提交
2

3 4 5
__all__ = [
    "simple_img_conv_pool",
    "sequence_conv_pool",
6
    "glu",
7
]
D
dzhwinter 已提交
8

F
fengjiayi 已提交
9 10 11

def simple_img_conv_pool(input,
                         num_filters,
D
dzhwinter 已提交
12
                         filter_size,
F
fengjiayi 已提交
13 14 15
                         pool_size,
                         pool_stride,
                         act,
F
fengjiayi 已提交
16
                         param_attr=None,
17
                         pool_type='max'):
F
fengjiayi 已提交
18 19 20 21
    conv_out = layers.conv2d(
        input=input,
        num_filters=num_filters,
        filter_size=filter_size,
F
fengjiayi 已提交
22
        param_attr=param_attr,
23
        act=act)
F
fengjiayi 已提交
24 25 26 27

    pool_out = layers.pool2d(
        input=conv_out,
        pool_size=pool_size,
Q
Qiao Longfei 已提交
28
        pool_type=pool_type,
29
        pool_stride=pool_stride)
Q
Qiao Longfei 已提交
30 31 32 33 34 35 36 37 38
    return pool_out


def img_conv_group(input,
                   conv_num_filter,
                   pool_size,
                   conv_padding=1,
                   conv_filter_size=3,
                   conv_act=None,
F
fengjiayi 已提交
39
                   param_attr=None,
Q
Qiao Longfei 已提交
40 41 42
                   conv_with_batchnorm=False,
                   conv_batchnorm_drop_rate=None,
                   pool_stride=1,
43
                   pool_type=None):
Q
Qiao Longfei 已提交
44 45 46 47 48
    """
    Image Convolution Group, Used for vgg net.
    """
    tmp = input
    assert isinstance(conv_num_filter, list) or \
49
        isinstance(conv_num_filter, tuple)
Q
Qiao Longfei 已提交
50 51 52 53 54 55 56 57 58

    def __extend_list__(obj):
        if not hasattr(obj, '__len__'):
            return [obj] * len(conv_num_filter)
        else:
            return obj

    conv_padding = __extend_list__(conv_padding)
    conv_filter_size = __extend_list__(conv_filter_size)
F
fengjiayi 已提交
59
    param_attr = __extend_list__(param_attr)
Q
Qiao Longfei 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72
    conv_with_batchnorm = __extend_list__(conv_with_batchnorm)
    conv_batchnorm_drop_rate = __extend_list__(conv_batchnorm_drop_rate)

    for i in xrange(len(conv_num_filter)):
        local_conv_act = conv_act
        if conv_with_batchnorm[i]:
            local_conv_act = None

        tmp = layers.conv2d(
            input=tmp,
            num_filters=conv_num_filter[i],
            filter_size=conv_filter_size[i],
            padding=conv_padding[i],
F
fengjiayi 已提交
73
            param_attr=param_attr[i],
74
            act=local_conv_act)
Q
Qiao Longfei 已提交
75 76

        if conv_with_batchnorm[i]:
77
            tmp = layers.batch_norm(input=tmp, act=conv_act)
Q
Qiao Longfei 已提交
78 79
            drop_rate = conv_batchnorm_drop_rate[i]
            if abs(drop_rate) > 1e-5:
80
                tmp = layers.dropout(x=tmp, dropout_prob=drop_rate)
Q
Qiao Longfei 已提交
81 82 83 84 85

    pool_out = layers.pool2d(
        input=tmp,
        pool_size=pool_size,
        pool_type=pool_type,
86
        pool_stride=pool_stride)
F
fengjiayi 已提交
87
    return pool_out
D
dzhwinter 已提交
88 89 90 91 92


def sequence_conv_pool(input,
                       num_filters,
                       filter_size,
F
fengjiayi 已提交
93
                       param_attr=None,
94
                       act="sigmoid",
95
                       pool_type="max"):
D
dzhwinter 已提交
96 97 98 99
    conv_out = layers.sequence_conv(
        input=input,
        num_filters=num_filters,
        filter_size=filter_size,
F
fengjiayi 已提交
100
        param_attr=param_attr,
101
        act=act)
D
dzhwinter 已提交
102

103
    pool_out = layers.sequence_pool(input=conv_out, pool_type=pool_type)
D
dzhwinter 已提交
104
    return pool_out
G
guosheng 已提交
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131


def glu(input, dim=-1):
    """
    The gated linear unit composed by split and elementwise multiplication. 
    Specifically, Split the input into two equal sized parts :math:`a` and 
    :math:`b` along the given dimension and then compute as following:

        .. math::

            {GLU}(a, b)= a \otimes \sigma(b)

    Refer to `Language Modeling with Gated Convolutional Networks 
    <https://arxiv.org/pdf/1612.08083.pdf>`_.
    
    Args:
        input (Variable): The input variable which is a Tensor or LoDTensor.
        dim (int): The dimension along which to split. If :math:`dim < 0`, the 
            dimension to split along is :math:`rank(input) + dim`.

    Returns:
        Variable: The Tensor variable with half the size of input.

    Examples:
        .. code-block:: python

            # x is a Tensor variable with shape [3, 6, 9]
132
            fluid.nets.glu(input=x, dim=1)  # shape of output: [3, 3, 9]
G
guosheng 已提交
133 134 135 136 137
    """

    a, b = layers.split(input, num_or_sections=2, dim=dim)
    out = layers.elementwise_mul(x=a, y=b)
    return out