nets.py 4.7 KB
Newer Older
D
dzhwinter 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
#  Copyright (c) 2018 PaddlePaddle Authors. All Rights Reserve.
#
#Licensed under the Apache License, Version 2.0 (the "License");
#you may not use this file except in compliance with the License.
#You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#Unless required by applicable law or agreed to in writing, software
#distributed under the License is distributed on an "AS IS" BASIS,
#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#See the License for the specific language governing permissions and
#limitations under the License.
14
import layers
F
fengjiayi 已提交
15

16 17 18
__all__ = [
    "simple_img_conv_pool",
    "sequence_conv_pool",
19
    "glu",
20
]
D
dzhwinter 已提交
21

F
fengjiayi 已提交
22 23 24

def simple_img_conv_pool(input,
                         num_filters,
D
dzhwinter 已提交
25
                         filter_size,
F
fengjiayi 已提交
26 27 28
                         pool_size,
                         pool_stride,
                         act,
F
fengjiayi 已提交
29
                         param_attr=None,
30
                         pool_type='max'):
F
fengjiayi 已提交
31 32 33 34
    conv_out = layers.conv2d(
        input=input,
        num_filters=num_filters,
        filter_size=filter_size,
F
fengjiayi 已提交
35
        param_attr=param_attr,
36
        act=act)
F
fengjiayi 已提交
37 38 39 40

    pool_out = layers.pool2d(
        input=conv_out,
        pool_size=pool_size,
Q
Qiao Longfei 已提交
41
        pool_type=pool_type,
42
        pool_stride=pool_stride)
Q
Qiao Longfei 已提交
43 44 45 46 47 48 49 50 51
    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 已提交
52
                   param_attr=None,
Q
Qiao Longfei 已提交
53 54 55
                   conv_with_batchnorm=False,
                   conv_batchnorm_drop_rate=None,
                   pool_stride=1,
56
                   pool_type=None):
Q
Qiao Longfei 已提交
57 58 59 60 61
    """
    Image Convolution Group, Used for vgg net.
    """
    tmp = input
    assert isinstance(conv_num_filter, list) or \
62
        isinstance(conv_num_filter, tuple)
Q
Qiao Longfei 已提交
63 64 65 66 67 68 69 70 71

    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 已提交
72
    param_attr = __extend_list__(param_attr)
Q
Qiao Longfei 已提交
73 74 75 76 77 78 79 80 81 82 83 84 85
    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 已提交
86
            param_attr=param_attr[i],
87
            act=local_conv_act)
Q
Qiao Longfei 已提交
88 89

        if conv_with_batchnorm[i]:
90
            tmp = layers.batch_norm(input=tmp, act=conv_act)
Q
Qiao Longfei 已提交
91 92
            drop_rate = conv_batchnorm_drop_rate[i]
            if abs(drop_rate) > 1e-5:
93
                tmp = layers.dropout(x=tmp, dropout_prob=drop_rate)
Q
Qiao Longfei 已提交
94 95 96 97 98

    pool_out = layers.pool2d(
        input=tmp,
        pool_size=pool_size,
        pool_type=pool_type,
99
        pool_stride=pool_stride)
F
fengjiayi 已提交
100
    return pool_out
D
dzhwinter 已提交
101 102 103 104 105


def sequence_conv_pool(input,
                       num_filters,
                       filter_size,
F
fengjiayi 已提交
106
                       param_attr=None,
107
                       act="sigmoid",
108
                       pool_type="max"):
D
dzhwinter 已提交
109 110 111 112
    conv_out = layers.sequence_conv(
        input=input,
        num_filters=num_filters,
        filter_size=filter_size,
F
fengjiayi 已提交
113
        param_attr=param_attr,
114
        act=act)
D
dzhwinter 已提交
115

116
    pool_out = layers.sequence_pool(input=conv_out, pool_type=pool_type)
D
dzhwinter 已提交
117
    return pool_out
G
guosheng 已提交
118 119 120 121


def glu(input, dim=-1):
    """
G
guosheng 已提交
122 123 124 125
    The gated linear unit composed by split, sigmoid activation 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:
G
guosheng 已提交
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145

        .. 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]
146
            fluid.nets.glu(input=x, dim=1)  # shape of output: [3, 3, 9]
G
guosheng 已提交
147 148 149
    """

    a, b = layers.split(input, num_or_sections=2, dim=dim)
G
guosheng 已提交
150 151
    act_b = layers.sigmoid(x=b)
    out = layers.elementwise_mul(x=a, y=act_b)
G
guosheng 已提交
152
    return out