resnet.py 25.3 KB
Newer Older
L
LielinJiang 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
#
# 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.

L
LielinJiang 已提交
15
import paddle
16
from paddle import nn
17
from paddle.utils.download import get_weights_path_from_url
L
LielinJiang 已提交
18

19
__all__ = []
L
LielinJiang 已提交
20 21

model_urls = {
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
    'resnet18': (
        'https://paddle-hapi.bj.bcebos.com/models/resnet18.pdparams',
        'cf548f46534aa3560945be4b95cd11c4',
    ),
    'resnet34': (
        'https://paddle-hapi.bj.bcebos.com/models/resnet34.pdparams',
        '8d2275cf8706028345f78ac0e1d31969',
    ),
    'resnet50': (
        'https://paddle-hapi.bj.bcebos.com/models/resnet50.pdparams',
        'ca6f485ee1ab0492d38f323885b0ad80',
    ),
    'resnet101': (
        'https://paddle-hapi.bj.bcebos.com/models/resnet101.pdparams',
        '02f35f034ca3858e1e54d4036443c92d',
    ),
    'resnet152': (
        'https://paddle-hapi.bj.bcebos.com/models/resnet152.pdparams',
        '7ad16a2f1e7333859ff986138630fd7a',
    ),
    'resnext50_32x4d': (
        'https://paddle-hapi.bj.bcebos.com/models/resnext50_32x4d.pdparams',
        'dc47483169be7d6f018fcbb7baf8775d',
    ),
    "resnext50_64x4d": (
        'https://paddle-hapi.bj.bcebos.com/models/resnext50_64x4d.pdparams',
        '063d4b483e12b06388529450ad7576db',
    ),
    'resnext101_32x4d': (
        'https://paddle-hapi.bj.bcebos.com/models/resnext101_32x4d.pdparams',
        '967b090039f9de2c8d06fe994fb9095f',
    ),
    'resnext101_64x4d': (
        'https://paddle-hapi.bj.bcebos.com/models/resnext101_64x4d.pdparams',
        '98e04e7ca616a066699230d769d03008',
    ),
    'resnext152_32x4d': (
        'https://paddle-hapi.bj.bcebos.com/models/resnext152_32x4d.pdparams',
        '18ff0beee21f2efc99c4b31786107121',
    ),
    'resnext152_64x4d': (
        'https://paddle-hapi.bj.bcebos.com/models/resnext152_64x4d.pdparams',
        '77c4af00ca42c405fa7f841841959379',
    ),
    'wide_resnet50_2': (
        'https://paddle-hapi.bj.bcebos.com/models/wide_resnet50_2.pdparams',
        '0282f804d73debdab289bd9fea3fa6dc',
    ),
    'wide_resnet101_2': (
        'https://paddle-hapi.bj.bcebos.com/models/wide_resnet101_2.pdparams',
        'd4360a2d23657f059216f5d5a1a9ac93',
    ),
L
LielinJiang 已提交
74 75 76
}


L
LielinJiang 已提交
77 78 79
class BasicBlock(nn.Layer):
    expansion = 1

80 81 82 83 84 85 86 87 88 89 90
    def __init__(
        self,
        inplanes,
        planes,
        stride=1,
        downsample=None,
        groups=1,
        base_width=64,
        dilation=1,
        norm_layer=None,
    ):
91
        super().__init__()
L
LielinJiang 已提交
92
        if norm_layer is None:
C
cnn 已提交
93
            norm_layer = nn.BatchNorm2D
L
LielinJiang 已提交
94

L
LielinJiang 已提交
95 96
        if dilation > 1:
            raise NotImplementedError(
97 98 99 100 101 102
                "Dilation > 1 not supported in BasicBlock"
            )

        self.conv1 = nn.Conv2D(
            inplanes, planes, 3, padding=1, stride=stride, bias_attr=False
        )
L
LielinJiang 已提交
103 104
        self.bn1 = norm_layer(planes)
        self.relu = nn.ReLU()
C
cnn 已提交
105
        self.conv2 = nn.Conv2D(planes, planes, 3, padding=1, bias_attr=False)
L
LielinJiang 已提交
106 107 108
        self.bn2 = norm_layer(planes)
        self.downsample = downsample
        self.stride = stride
L
LielinJiang 已提交
109

L
LielinJiang 已提交
110 111
    def forward(self, x):
        identity = x
L
LielinJiang 已提交
112

L
LielinJiang 已提交
113 114 115
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)
L
LielinJiang 已提交
116

L
LielinJiang 已提交
117 118
        out = self.conv2(out)
        out = self.bn2(out)
L
LielinJiang 已提交
119

L
LielinJiang 已提交
120 121
        if self.downsample is not None:
            identity = self.downsample(x)
L
LielinJiang 已提交
122

L
LielinJiang 已提交
123 124
        out += identity
        out = self.relu(out)
L
LielinJiang 已提交
125

L
LielinJiang 已提交
126
        return out
L
LielinJiang 已提交
127

L
LielinJiang 已提交
128 129

class BottleneckBlock(nn.Layer):
L
LielinJiang 已提交
130 131
    expansion = 4

132 133 134 135 136 137 138 139 140 141 142
    def __init__(
        self,
        inplanes,
        planes,
        stride=1,
        downsample=None,
        groups=1,
        base_width=64,
        dilation=1,
        norm_layer=None,
    ):
143
        super().__init__()
L
LielinJiang 已提交
144
        if norm_layer is None:
C
cnn 已提交
145
            norm_layer = nn.BatchNorm2D
146
        width = int(planes * (base_width / 64.0)) * groups
L
LielinJiang 已提交
147

C
cnn 已提交
148
        self.conv1 = nn.Conv2D(inplanes, width, 1, bias_attr=False)
L
LielinJiang 已提交
149 150
        self.bn1 = norm_layer(width)

151 152 153 154 155 156 157 158 159 160
        self.conv2 = nn.Conv2D(
            width,
            width,
            3,
            padding=dilation,
            stride=stride,
            groups=groups,
            dilation=dilation,
            bias_attr=False,
        )
L
LielinJiang 已提交
161
        self.bn2 = norm_layer(width)
L
LielinJiang 已提交
162

163 164 165
        self.conv3 = nn.Conv2D(
            width, planes * self.expansion, 1, bias_attr=False
        )
L
LielinJiang 已提交
166 167 168 169
        self.bn3 = norm_layer(planes * self.expansion)
        self.relu = nn.ReLU()
        self.downsample = downsample
        self.stride = stride
L
LielinJiang 已提交
170

L
LielinJiang 已提交
171 172
    def forward(self, x):
        identity = x
L
LielinJiang 已提交
173

L
LielinJiang 已提交
174 175 176
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)
L
LielinJiang 已提交
177

L
LielinJiang 已提交
178 179 180
        out = self.conv2(out)
        out = self.bn2(out)
        out = self.relu(out)
L
LielinJiang 已提交
181

L
LielinJiang 已提交
182 183
        out = self.conv3(out)
        out = self.bn3(out)
L
LielinJiang 已提交
184

L
LielinJiang 已提交
185 186
        if self.downsample is not None:
            identity = self.downsample(x)
L
LielinJiang 已提交
187

L
LielinJiang 已提交
188 189
        out += identity
        out = self.relu(out)
L
LielinJiang 已提交
190

L
LielinJiang 已提交
191
        return out
L
LielinJiang 已提交
192

L
LielinJiang 已提交
193 194

class ResNet(nn.Layer):
L
LielinJiang 已提交
195
    """ResNet model from
196
    `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.
L
LielinJiang 已提交
197 198

    Args:
199 200 201
        Block (BasicBlock|BottleneckBlock): Block module of model.
        depth (int, optional): Layers of ResNet, Default: 50.
        width (int, optional): Base width per convolution group for each convolution block, Default: 64.
202
        num_classes (int, optional): Output dim of last fc layer. If num_classes <= 0, last fc layer
L
LielinJiang 已提交
203
                            will not be defined. Default: 1000.
204 205
        with_pool (bool, optional): Use pool before the last fc layer or not. Default: True.
        groups (int, optional): Number of groups for each convolution block, Default: 1.
L
LielinJiang 已提交
206

N
Nyakku Shigure 已提交
207
    Returns:
208
        :ref:`api_paddle_nn_Layer`. An instance of ResNet model.
N
Nyakku Shigure 已提交
209

L
LielinJiang 已提交
210 211 212
    Examples:
        .. code-block:: python

213 214 215
            >>> import paddle
            >>> from paddle.vision.models import ResNet
            >>> from paddle.vision.models.resnet import BottleneckBlock, BasicBlock
L
LielinJiang 已提交
216

217 218
            >>> # build ResNet with 18 layers
            >>> resnet18 = ResNet(BasicBlock, 18)
219

220 221
            >>> # build ResNet with 50 layers
            >>> resnet50 = ResNet(BottleneckBlock, 50)
L
LielinJiang 已提交
222

223 224
            >>> # build Wide ResNet model
            >>> wide_resnet50_2 = ResNet(BottleneckBlock, 50, width=64*2)
225

226 227
            >>> # build ResNeXt model
            >>> resnext50_32x4d = ResNet(BottleneckBlock, 50, width=4, groups=32)
L
LielinJiang 已提交
228

229 230
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = resnet18(x)
231

232 233
            >>> print(out.shape)
            [1, 1000]
L
LielinJiang 已提交
234 235
    """

236 237 238 239 240 241 242 243 244
    def __init__(
        self,
        block,
        depth=50,
        width=64,
        num_classes=1000,
        with_pool=True,
        groups=1,
    ):
245
        super().__init__()
L
LielinJiang 已提交
246
        layer_cfg = {
L
LielinJiang 已提交
247 248 249 250
            18: [2, 2, 2, 2],
            34: [3, 4, 6, 3],
            50: [3, 4, 6, 3],
            101: [3, 4, 23, 3],
251
            152: [3, 8, 36, 3],
L
LielinJiang 已提交
252
        }
L
LielinJiang 已提交
253
        layers = layer_cfg[depth]
254
        self.groups = groups
255
        self.base_width = width
L
LielinJiang 已提交
256 257
        self.num_classes = num_classes
        self.with_pool = with_pool
C
cnn 已提交
258
        self._norm_layer = nn.BatchNorm2D
L
LielinJiang 已提交
259 260 261

        self.inplanes = 64
        self.dilation = 1
L
LielinJiang 已提交
262

263 264 265 266 267 268 269 270
        self.conv1 = nn.Conv2D(
            3,
            self.inplanes,
            kernel_size=7,
            stride=2,
            padding=3,
            bias_attr=False,
        )
L
LielinJiang 已提交
271 272
        self.bn1 = self._norm_layer(self.inplanes)
        self.relu = nn.ReLU()
C
cnn 已提交
273
        self.maxpool = nn.MaxPool2D(kernel_size=3, stride=2, padding=1)
L
LielinJiang 已提交
274 275 276 277
        self.layer1 = self._make_layer(block, 64, layers[0])
        self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
        self.layer3 = self._make_layer(block, 256, layers[2], stride=2)
        self.layer4 = self._make_layer(block, 512, layers[3], stride=2)
L
LielinJiang 已提交
278
        if with_pool:
C
cnn 已提交
279
            self.avgpool = nn.AdaptiveAvgPool2D((1, 1))
L
LielinJiang 已提交
280 281

        if num_classes > 0:
L
LielinJiang 已提交
282 283 284 285 286 287 288 289 290 291 292
            self.fc = nn.Linear(512 * block.expansion, num_classes)

    def _make_layer(self, block, planes, blocks, stride=1, dilate=False):
        norm_layer = self._norm_layer
        downsample = None
        previous_dilation = self.dilation
        if dilate:
            self.dilation *= stride
            stride = 1
        if stride != 1 or self.inplanes != planes * block.expansion:
            downsample = nn.Sequential(
293 294 295 296 297 298 299
                nn.Conv2D(
                    self.inplanes,
                    planes * block.expansion,
                    1,
                    stride=stride,
                    bias_attr=False,
                ),
300 301
                norm_layer(planes * block.expansion),
            )
L
LielinJiang 已提交
302 303 304

        layers = []
        layers.append(
305 306 307 308 309 310 311 312 313 314 315
            block(
                self.inplanes,
                planes,
                stride,
                downsample,
                self.groups,
                self.base_width,
                previous_dilation,
                norm_layer,
            )
        )
L
LielinJiang 已提交
316 317
        self.inplanes = planes * block.expansion
        for _ in range(1, blocks):
318
            layers.append(
319 320 321 322 323 324 325 326
                block(
                    self.inplanes,
                    planes,
                    groups=self.groups,
                    base_width=self.base_width,
                    norm_layer=norm_layer,
                )
            )
L
LielinJiang 已提交
327 328 329 330 331 332 333 334 335 336 337 338 339

        return nn.Sequential(*layers)

    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.maxpool(x)
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)

L
LielinJiang 已提交
340
        if self.with_pool:
L
LielinJiang 已提交
341 342 343 344
            x = self.avgpool(x)

        if self.num_classes > 0:
            x = paddle.flatten(x, 1)
L
LielinJiang 已提交
345
            x = self.fc(x)
L
LielinJiang 已提交
346

L
LielinJiang 已提交
347 348 349 350 351 352
        return x


def _resnet(arch, Block, depth, pretrained, **kwargs):
    model = ResNet(Block, depth, **kwargs)
    if pretrained:
353 354 355 356 357 358 359 360
        assert (
            arch in model_urls
        ), "{} model do not have a pretrained model now, you should set pretrained=False".format(
            arch
        )
        weight_path = get_weights_path_from_url(
            model_urls[arch][0], model_urls[arch][1]
        )
361 362

        param = paddle.load(weight_path)
363 364
        model.set_dict(param)

L
LielinJiang 已提交
365 366 367 368
    return model


def resnet18(pretrained=False, **kwargs):
369
    """ResNet 18-layer model from
370
    `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.
371

L
LielinJiang 已提交
372
    Args:
N
Nyakku Shigure 已提交
373 374
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
375
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
376 377

    Returns:
378
        :ref:`api_paddle_nn_Layer`. An instance of ResNet 18-layer model.
L
LielinJiang 已提交
379 380 381 382

    Examples:
        .. code-block:: python

383 384
            >>> import paddle
            >>> from paddle.vision.models import resnet18
L
LielinJiang 已提交
385

386 387
            >>> # build model
            >>> model = resnet18()
L
LielinJiang 已提交
388

389 390
            >>> # build model and load imagenet pretrained weight
            >>> # model = resnet18(pretrained=True)
391

392 393
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
394

395 396
            >>> print(out.shape)
            [1, 1000]
L
LielinJiang 已提交
397 398 399 400 401
    """
    return _resnet('resnet18', BasicBlock, 18, pretrained, **kwargs)


def resnet34(pretrained=False, **kwargs):
402
    """ResNet 34-layer model from
403
    `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.
404

L
LielinJiang 已提交
405
    Args:
N
Nyakku Shigure 已提交
406 407
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
408
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
409 410

    Returns:
411
        :ref:`api_paddle_nn_Layer`. An instance of ResNet 34-layer model.
412

L
LielinJiang 已提交
413 414 415
    Examples:
        .. code-block:: python

416 417
            >>> import paddle
            >>> from paddle.vision.models import resnet34
L
LielinJiang 已提交
418

419 420
            >>> # build model
            >>> model = resnet34()
L
LielinJiang 已提交
421

422 423
            >>> # build model and load imagenet pretrained weight
            >>> # model = resnet34(pretrained=True)
424

425 426
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
427

428 429
            >>> print(out.shape)
            [1, 1000]
L
LielinJiang 已提交
430 431 432 433 434
    """
    return _resnet('resnet34', BasicBlock, 34, pretrained, **kwargs)


def resnet50(pretrained=False, **kwargs):
435
    """ResNet 50-layer model from
436
    `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.
437

L
LielinJiang 已提交
438
    Args:
N
Nyakku Shigure 已提交
439 440
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
441
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
442 443

    Returns:
444
        :ref:`api_paddle_nn_Layer`. An instance of ResNet 50-layer model.
L
LielinJiang 已提交
445 446 447 448

    Examples:
        .. code-block:: python

449 450
            >>> import paddle
            >>> from paddle.vision.models import resnet50
L
LielinJiang 已提交
451

452 453
            >>> # build model
            >>> model = resnet50()
L
LielinJiang 已提交
454

455 456
            >>> # build model and load imagenet pretrained weight
            >>> # model = resnet50(pretrained=True)
457

458 459
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
460

461 462
            >>> print(out.shape)
            [1, 1000]
L
LielinJiang 已提交
463 464 465 466 467
    """
    return _resnet('resnet50', BottleneckBlock, 50, pretrained, **kwargs)


def resnet101(pretrained=False, **kwargs):
468
    """ResNet 101-layer model from
469
    `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.
470

L
LielinJiang 已提交
471
    Args:
N
Nyakku Shigure 已提交
472 473
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
474
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
475 476

    Returns:
477
        :ref:`api_paddle_nn_Layer`. An instance of ResNet 101-layer.
L
LielinJiang 已提交
478 479 480 481

    Examples:
        .. code-block:: python

482 483
            >>> import paddle
            >>> from paddle.vision.models import resnet101
L
LielinJiang 已提交
484

485 486
            >>> # build model
            >>> model = resnet101()
L
LielinJiang 已提交
487

488 489
            >>> # build model and load imagenet pretrained weight
            >>> # model = resnet101(pretrained=True)
490

491 492
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
493

494 495
            >>> print(out.shape)
            [1, 1000]
L
LielinJiang 已提交
496 497 498 499 500
    """
    return _resnet('resnet101', BottleneckBlock, 101, pretrained, **kwargs)


def resnet152(pretrained=False, **kwargs):
501
    """ResNet 152-layer model from
502
    `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.
503

L
LielinJiang 已提交
504
    Args:
N
Nyakku Shigure 已提交
505 506
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
507
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
508 509

    Returns:
510
        :ref:`api_paddle_nn_Layer`. An instance of ResNet 152-layer model.
L
LielinJiang 已提交
511 512 513 514

    Examples:
        .. code-block:: python

515 516
            >>> import paddle
            >>> from paddle.vision.models import resnet152
L
LielinJiang 已提交
517

518 519
            >>> # build model
            >>> model = resnet152()
L
LielinJiang 已提交
520

521 522
            >>> # build model and load imagenet pretrained weight
            >>> # model = resnet152(pretrained=True)
523

524 525
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
526

527 528
            >>> print(out.shape)
            [1, 1000]
L
LielinJiang 已提交
529 530
    """
    return _resnet('resnet152', BottleneckBlock, 152, pretrained, **kwargs)
531 532


533 534
def resnext50_32x4d(pretrained=False, **kwargs):
    """ResNeXt-50 32x4d model from
535
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
536

537
    Args:
N
Nyakku Shigure 已提交
538 539
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
540
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
541 542

    Returns:
543
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-50 32x4d model.
544 545 546 547

    Examples:
        .. code-block:: python

548 549
            >>> import paddle
            >>> from paddle.vision.models import resnext50_32x4d
550

551 552
            >>> # build model
            >>> model = resnext50_32x4d()
553

554 555
            >>> # build model and load imagenet pretrained weight
            >>> # model = resnext50_32x4d(pretrained=True)
556

557 558
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
559

560 561
            >>> print(out.shape)
            [1, 1000]
562 563 564 565 566 567 568 569
    """
    kwargs['groups'] = 32
    kwargs['width'] = 4
    return _resnet('resnext50_32x4d', BottleneckBlock, 50, pretrained, **kwargs)


def resnext50_64x4d(pretrained=False, **kwargs):
    """ResNeXt-50 64x4d model from
570
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
571

572
    Args:
N
Nyakku Shigure 已提交
573 574
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
575
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
576 577

    Returns:
578
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-50 64x4d model.
579 580 581 582

    Examples:
        .. code-block:: python

583 584
            >>> import paddle
            >>> from paddle.vision.models import resnext50_64x4d
585

586 587
            >>> # build model
            >>> model = resnext50_64x4d()
588

589 590
            >>> # build model and load imagenet pretrained weight
            >>> # model = resnext50_64x4d(pretrained=True)
591

592 593
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
594

595 596
            >>> print(out.shape)
            [1, 1000]
597 598 599 600 601 602 603 604
    """
    kwargs['groups'] = 64
    kwargs['width'] = 4
    return _resnet('resnext50_64x4d', BottleneckBlock, 50, pretrained, **kwargs)


def resnext101_32x4d(pretrained=False, **kwargs):
    """ResNeXt-101 32x4d model from
605
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
606

607
    Args:
N
Nyakku Shigure 已提交
608 609
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
610
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
611 612

    Returns:
613
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-101 32x4d model.
614 615 616 617

    Examples:
        .. code-block:: python

618 619
            >>> import paddle
            >>> from paddle.vision.models import resnext101_32x4d
620

621 622
            >>> # build model
            >>> model = resnext101_32x4d()
623

624 625
            >>> # build model and load imagenet pretrained weight
            >>> # model = resnext101_32x4d(pretrained=True)
626

627 628
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
629

630 631
            >>> print(out.shape)
            [1, 1000]
632 633 634
    """
    kwargs['groups'] = 32
    kwargs['width'] = 4
635 636 637
    return _resnet(
        'resnext101_32x4d', BottleneckBlock, 101, pretrained, **kwargs
    )
638 639 640 641


def resnext101_64x4d(pretrained=False, **kwargs):
    """ResNeXt-101 64x4d model from
642
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
643

644
    Args:
N
Nyakku Shigure 已提交
645 646
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
647
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
648 649

    Returns:
650
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-101 64x4d model.
651 652 653 654

    Examples:
        .. code-block:: python

655 656
            >>> import paddle
            >>> from paddle.vision.models import resnext101_64x4d
657

658 659
            >>> # build model
            >>> model = resnext101_64x4d()
660

661 662
            >>> # build model and load imagenet pretrained weight
            >>> # model = resnext101_64x4d(pretrained=True)
663

664 665
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
666

667 668
            >>> print(out.shape)
            [1, 1000]
669 670 671
    """
    kwargs['groups'] = 64
    kwargs['width'] = 4
672 673 674
    return _resnet(
        'resnext101_64x4d', BottleneckBlock, 101, pretrained, **kwargs
    )
675 676 677 678


def resnext152_32x4d(pretrained=False, **kwargs):
    """ResNeXt-152 32x4d model from
679
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
680

681
    Args:
N
Nyakku Shigure 已提交
682 683
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
684
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
685 686

    Returns:
687
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-152 32x4d model.
688 689 690 691

    Examples:
        .. code-block:: python

692 693
            >>> import paddle
            >>> from paddle.vision.models import resnext152_32x4d
694

695 696
            >>> # build model
            >>> model = resnext152_32x4d()
697

698 699
            >>> # build model and load imagenet pretrained weight
            >>> # model = resnext152_32x4d(pretrained=True)
700

701 702
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
703

704 705
            >>> print(out.shape)
            [1, 1000]
706 707 708
    """
    kwargs['groups'] = 32
    kwargs['width'] = 4
709 710 711
    return _resnet(
        'resnext152_32x4d', BottleneckBlock, 152, pretrained, **kwargs
    )
712 713 714 715


def resnext152_64x4d(pretrained=False, **kwargs):
    """ResNeXt-152 64x4d model from
716
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
717

718
    Args:
N
Nyakku Shigure 已提交
719 720
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
721
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
722 723

    Returns:
724
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-152 64x4d model.
725 726 727 728

    Examples:
        .. code-block:: python

729 730
            >>> import paddle
            >>> from paddle.vision.models import resnext152_64x4d
731

732 733
            >>> # build model
            >>> model = resnext152_64x4d()
734

735 736
            >>> # build model and load imagenet pretrained weight
            >>> # model = resnext152_64x4d(pretrained=True)
737

738 739
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
740

741 742
            >>> print(out.shape)
            [1, 1000]
743 744 745
    """
    kwargs['groups'] = 64
    kwargs['width'] = 4
746 747 748
    return _resnet(
        'resnext152_64x4d', BottleneckBlock, 152, pretrained, **kwargs
    )
749 750


751 752 753 754 755
def wide_resnet50_2(pretrained=False, **kwargs):
    """Wide ResNet-50-2 model from
    `"Wide Residual Networks" <https://arxiv.org/pdf/1605.07146.pdf>`_.

    Args:
N
Nyakku Shigure 已提交
756 757
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
758
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
759 760

    Returns:
761
        :ref:`api_paddle_nn_Layer`. An instance of Wide ResNet-50-2 model.
762 763 764 765

    Examples:
        .. code-block:: python

766 767
            >>> import paddle
            >>> from paddle.vision.models import wide_resnet50_2
768

769 770
            >>> # build model
            >>> model = wide_resnet50_2()
771

772 773
            >>> # build model and load imagenet pretrained weight
            >>> # model = wide_resnet50_2(pretrained=True)
774

775 776
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
777

778 779
            >>> print(out.shape)
            [1, 1000]
780 781 782 783 784 785 786 787 788 789
    """
    kwargs['width'] = 64 * 2
    return _resnet('wide_resnet50_2', BottleneckBlock, 50, pretrained, **kwargs)


def wide_resnet101_2(pretrained=False, **kwargs):
    """Wide ResNet-101-2 model from
    `"Wide Residual Networks" <https://arxiv.org/pdf/1605.07146.pdf>`_.

    Args:
N
Nyakku Shigure 已提交
790 791
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
792
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
793 794

    Returns:
795
        :ref:`api_paddle_nn_Layer`. An instance of Wide ResNet-101-2 model.
796 797 798 799

    Examples:
        .. code-block:: python

800 801
            >>> import paddle
            >>> from paddle.vision.models import wide_resnet101_2
802

803 804
            >>> # build model
            >>> model = wide_resnet101_2()
805

806 807
            >>> # build model and load imagenet pretrained weight
            >>> # model = wide_resnet101_2(pretrained=True)
808

809 810
            >>> x = paddle.rand([1, 3, 224, 224])
            >>> out = model(x)
811

812 813
            >>> print(out.shape)
            [1, 1000]
814 815
    """
    kwargs['width'] = 64 * 2
816 817 818
    return _resnet(
        'wide_resnet101_2', BottleneckBlock, 101, pretrained, **kwargs
    )