resnet.py 24.8 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 16
import paddle
import paddle.nn as nn
L
LielinJiang 已提交
17

18
from paddle.utils.download import get_weights_path_from_url
L
LielinJiang 已提交
19

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

model_urls = {
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 74
    '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 已提交
75 76 77
}


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

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

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

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

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

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

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

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

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

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

L
LielinJiang 已提交
129 130

class BottleneckBlock(nn.Layer):
L
LielinJiang 已提交
131 132 133

    expansion = 4

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

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

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

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

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

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

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

L
LielinJiang 已提交
184 185
        out = self.conv3(out)
        out = self.bn3(out)
L
LielinJiang 已提交
186

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

L
LielinJiang 已提交
190 191
        out += identity
        out = self.relu(out)
L
LielinJiang 已提交
192

L
LielinJiang 已提交
193
        return out
L
LielinJiang 已提交
194

L
LielinJiang 已提交
195 196

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

    Args:
201 202 203
        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.
204
        num_classes (int, optional): Output dim of last fc layer. If num_classes <= 0, last fc layer
L
LielinJiang 已提交
205
                            will not be defined. Default: 1000.
206 207
        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 已提交
208

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

L
LielinJiang 已提交
212 213 214
    Examples:
        .. code-block:: python

215
            import paddle
216 217
            from paddle.vision.models import ResNet
            from paddle.vision.models.resnet import BottleneckBlock, BasicBlock
L
LielinJiang 已提交
218

219 220 221 222
            # build ResNet with 18 layers
            resnet18 = ResNet(BasicBlock, 18)

            # build ResNet with 50 layers
L
LielinJiang 已提交
223 224
            resnet50 = ResNet(BottleneckBlock, 50)

225
            # build Wide ResNet model
226 227
            wide_resnet50_2 = ResNet(BottleneckBlock, 50, width=64*2)

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

231 232 233 234
            x = paddle.rand([1, 3, 224, 224])
            out = resnet18(x)

            print(out.shape)
235
            # [1, 1000]
L
LielinJiang 已提交
236 237
    """

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

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

265 266 267 268 269 270 271 272
        self.conv1 = nn.Conv2D(
            3,
            self.inplanes,
            kernel_size=7,
            stride=2,
            padding=3,
            bias_attr=False,
        )
L
LielinJiang 已提交
273 274
        self.bn1 = self._norm_layer(self.inplanes)
        self.relu = nn.ReLU()
C
cnn 已提交
275
        self.maxpool = nn.MaxPool2D(kernel_size=3, stride=2, padding=1)
L
LielinJiang 已提交
276 277 278 279
        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 已提交
280
        if with_pool:
C
cnn 已提交
281
            self.avgpool = nn.AdaptiveAvgPool2D((1, 1))
L
LielinJiang 已提交
282 283

        if num_classes > 0:
L
LielinJiang 已提交
284 285 286 287 288 289 290 291 292 293 294
            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(
295 296 297 298 299 300 301
                nn.Conv2D(
                    self.inplanes,
                    planes * block.expansion,
                    1,
                    stride=stride,
                    bias_attr=False,
                ),
302 303
                norm_layer(planes * block.expansion),
            )
L
LielinJiang 已提交
304 305 306

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

        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 已提交
342
        if self.with_pool:
L
LielinJiang 已提交
343 344 345 346
            x = self.avgpool(x)

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

L
LielinJiang 已提交
349 350 351 352 353 354
        return x


def _resnet(arch, Block, depth, pretrained, **kwargs):
    model = ResNet(Block, depth, **kwargs)
    if pretrained:
355 356 357 358 359 360 361 362
        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]
        )
363 364

        param = paddle.load(weight_path)
365 366
        model.set_dict(param)

L
LielinJiang 已提交
367 368 369 370
    return model


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

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

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

    Examples:
        .. code-block:: python

385
            import paddle
386
            from paddle.vision.models import resnet18
L
LielinJiang 已提交
387 388 389 390 391 392

            # build model
            model = resnet18()

            # build model and load imagenet pretrained weight
            # model = resnet18(pretrained=True)
393 394 395 396 397

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

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


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

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

    Returns:
413
        :ref:`api_paddle_nn_Layer`. An instance of ResNet 34-layer model.
414

L
LielinJiang 已提交
415 416 417
    Examples:
        .. code-block:: python

418
            import paddle
419
            from paddle.vision.models import resnet34
L
LielinJiang 已提交
420 421 422 423 424 425

            # build model
            model = resnet34()

            # build model and load imagenet pretrained weight
            # model = resnet34(pretrained=True)
426 427 428 429 430

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

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


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

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

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

    Examples:
        .. code-block:: python

451
            import paddle
452
            from paddle.vision.models import resnet50
L
LielinJiang 已提交
453 454 455 456 457 458

            # build model
            model = resnet50()

            # build model and load imagenet pretrained weight
            # model = resnet50(pretrained=True)
459 460 461 462 463

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

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


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

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

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

    Examples:
        .. code-block:: python

484
            import paddle
485
            from paddle.vision.models import resnet101
L
LielinJiang 已提交
486 487 488 489 490 491

            # build model
            model = resnet101()

            # build model and load imagenet pretrained weight
            # model = resnet101(pretrained=True)
492 493 494 495 496

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

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


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

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

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

    Examples:
        .. code-block:: python

517
            import paddle
518
            from paddle.vision.models import resnet152
L
LielinJiang 已提交
519 520 521 522 523 524

            # build model
            model = resnet152()

            # build model and load imagenet pretrained weight
            # model = resnet152(pretrained=True)
525 526 527 528 529

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

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


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

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

    Returns:
545
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-50 32x4d model.
546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import resnext50_32x4d

            # build model
            model = resnext50_32x4d()

            # build model and load imagenet pretrained weight
            # model = resnext50_32x4d(pretrained=True)

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

            print(out.shape)
            # [1, 1000]
    """
    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
572
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
573

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

    Returns:
580
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-50 64x4d model.
581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import resnext50_64x4d

            # build model
            model = resnext50_64x4d()

            # build model and load imagenet pretrained weight
            # model = resnext50_64x4d(pretrained=True)

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

            print(out.shape)
            # [1, 1000]
    """
    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
607
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
608

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

    Returns:
615
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-101 32x4d model.
616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import resnext101_32x4d

            # build model
            model = resnext101_32x4d()

            # build model and load imagenet pretrained weight
            # model = resnext101_32x4d(pretrained=True)

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

            print(out.shape)
            # [1, 1000]
    """
    kwargs['groups'] = 32
    kwargs['width'] = 4
637 638 639
    return _resnet(
        'resnext101_32x4d', BottleneckBlock, 101, pretrained, **kwargs
    )
640 641 642 643


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

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

    Returns:
652
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-101 64x4d model.
653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import resnext101_64x4d

            # build model
            model = resnext101_64x4d()

            # build model and load imagenet pretrained weight
            # model = resnext101_64x4d(pretrained=True)

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

            print(out.shape)
            # [1, 1000]
    """
    kwargs['groups'] = 64
    kwargs['width'] = 4
674 675 676
    return _resnet(
        'resnext101_64x4d', BottleneckBlock, 101, pretrained, **kwargs
    )
677 678 679 680


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

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

    Returns:
689
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-152 32x4d model.
690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import resnext152_32x4d

            # build model
            model = resnext152_32x4d()

            # build model and load imagenet pretrained weight
            # model = resnext152_32x4d(pretrained=True)

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

            print(out.shape)
            # [1, 1000]
    """
    kwargs['groups'] = 32
    kwargs['width'] = 4
711 712 713
    return _resnet(
        'resnext152_32x4d', BottleneckBlock, 152, pretrained, **kwargs
    )
714 715 716 717


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

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

    Returns:
726
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-152 64x4d model.
727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import resnext152_64x4d

            # build model
            model = resnext152_64x4d()

            # build model and load imagenet pretrained weight
            # model = resnext152_64x4d(pretrained=True)

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

            print(out.shape)
            # [1, 1000]
    """
    kwargs['groups'] = 64
    kwargs['width'] = 4
748 749 750
    return _resnet(
        'resnext152_64x4d', BottleneckBlock, 152, pretrained, **kwargs
    )
751 752


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

    Returns:
763
        :ref:`api_paddle_nn_Layer`. An instance of Wide ResNet-50-2 model.
764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import wide_resnet50_2

            # build model
            model = wide_resnet50_2()

            # build model and load imagenet pretrained weight
            # model = wide_resnet50_2(pretrained=True)

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

            print(out.shape)
781
            # [1, 1000]
782 783 784 785 786 787 788 789 790 791
    """
    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 已提交
792 793
        pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
                            on ImageNet. Default: False.
794
        **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_ResNet>`.
N
Nyakku Shigure 已提交
795 796

    Returns:
797
        :ref:`api_paddle_nn_Layer`. An instance of Wide ResNet-101-2 model.
798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814

    Examples:
        .. code-block:: python

            import paddle
            from paddle.vision.models import wide_resnet101_2

            # build model
            model = wide_resnet101_2()

            # build model and load imagenet pretrained weight
            # model = wide_resnet101_2(pretrained=True)

            x = paddle.rand([1, 3, 224, 224])
            out = model(x)

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