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
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 132

    expansion = 4

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

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

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

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

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

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

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

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

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

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

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

L
LielinJiang 已提交
194 195

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

L
LielinJiang 已提交
366 367 368 369
    return model


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

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

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

    Examples:
        .. code-block:: python

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

            # build model
            model = resnet18()

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

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

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


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

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

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

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

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

            # build model
            model = resnet34()

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

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

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


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

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

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

    Examples:
        .. code-block:: python

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

            # build model
            model = resnet50()

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

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

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


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

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

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

    Examples:
        .. code-block:: python

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

            # build model
            model = resnet101()

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

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

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


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

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

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

    Examples:
        .. code-block:: python

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

            # build model
            model = resnet152()

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

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

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


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

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

    Returns:
544
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-50 32x4d model.
545 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

    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
571
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
572

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

    Returns:
579
        :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-50 64x4d model.
580 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

    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
606
    `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
607

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

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

    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
636 637 638
    return _resnet(
        'resnext101_32x4d', BottleneckBlock, 101, pretrained, **kwargs
    )
639 640 641 642


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

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

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

    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
673 674 675
    return _resnet(
        'resnext101_64x4d', BottleneckBlock, 101, pretrained, **kwargs
    )
676 677 678 679


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

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

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

    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
710 711 712
    return _resnet(
        'resnext152_32x4d', BottleneckBlock, 152, pretrained, **kwargs
    )
713 714 715 716


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

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

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

    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
747 748 749
    return _resnet(
        'resnext152_64x4d', BottleneckBlock, 152, pretrained, **kwargs
    )
750 751


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

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

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

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

    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)
814
            # [1, 1000]
815 816
    """
    kwargs['width'] = 64 * 2
817 818 819
    return _resnet(
        'wide_resnet101_2', BottleneckBlock, 101, pretrained, **kwargs
    )