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

G
guosheng 已提交
3
__all__ = ["simple_img_conv_pool", "sequence_conv_pool", "glu"]
D
dzhwinter 已提交
4

F
fengjiayi 已提交
5 6 7

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

    pool_out = layers.pool2d(
        input=conv_out,
        pool_size=pool_size,
Q
Qiao Longfei 已提交
24
        pool_type=pool_type,
25
        pool_stride=pool_stride)
Q
Qiao Longfei 已提交
26 27 28 29 30 31 32 33 34
    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 已提交
35
                   param_attr=None,
Q
Qiao Longfei 已提交
36 37 38
                   conv_with_batchnorm=False,
                   conv_batchnorm_drop_rate=None,
                   pool_stride=1,
39
                   pool_type=None):
Q
Qiao Longfei 已提交
40 41 42 43 44
    """
    Image Convolution Group, Used for vgg net.
    """
    tmp = input
    assert isinstance(conv_num_filter, list) or \
45
        isinstance(conv_num_filter, tuple)
Q
Qiao Longfei 已提交
46 47 48 49 50 51 52 53 54

    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 已提交
55
    param_attr = __extend_list__(param_attr)
Q
Qiao Longfei 已提交
56 57 58 59 60 61 62 63 64 65 66 67 68
    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 已提交
69
            param_attr=param_attr[i],
70
            act=local_conv_act)
Q
Qiao Longfei 已提交
71 72

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

    pool_out = layers.pool2d(
        input=tmp,
        pool_size=pool_size,
        pool_type=pool_type,
82
        pool_stride=pool_stride)
F
fengjiayi 已提交
83
    return pool_out
D
dzhwinter 已提交
84 85 86 87 88


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

99
    pool_out = layers.sequence_pool(input=conv_out, pool_type=pool_type)
D
dzhwinter 已提交
100
    return pool_out
G
guosheng 已提交
101 102 103 104 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 132 133


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]
            fluid.nets.glu(input=x, dim=-1)  # shape of output: [3, 3, 9]
    """

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