resnet.py 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816
  1. # Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved.
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. # http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. import paddle
  15. from paddle import nn
  16. from paddle.utils.download import get_weights_path_from_url
  17. __all__ = []
  18. model_urls = {
  19. 'resnet18': (
  20. 'https://paddle-hapi.bj.bcebos.com/models/resnet18.pdparams',
  21. 'cf548f46534aa3560945be4b95cd11c4',
  22. ),
  23. 'resnet34': (
  24. 'https://paddle-hapi.bj.bcebos.com/models/resnet34.pdparams',
  25. '8d2275cf8706028345f78ac0e1d31969',
  26. ),
  27. 'resnet50': (
  28. 'https://paddle-hapi.bj.bcebos.com/models/resnet50.pdparams',
  29. 'ca6f485ee1ab0492d38f323885b0ad80',
  30. ),
  31. 'resnet101': (
  32. 'https://paddle-hapi.bj.bcebos.com/models/resnet101.pdparams',
  33. '02f35f034ca3858e1e54d4036443c92d',
  34. ),
  35. 'resnet152': (
  36. 'https://paddle-hapi.bj.bcebos.com/models/resnet152.pdparams',
  37. '7ad16a2f1e7333859ff986138630fd7a',
  38. ),
  39. 'resnext50_32x4d': (
  40. 'https://paddle-hapi.bj.bcebos.com/models/resnext50_32x4d.pdparams',
  41. 'dc47483169be7d6f018fcbb7baf8775d',
  42. ),
  43. "resnext50_64x4d": (
  44. 'https://paddle-hapi.bj.bcebos.com/models/resnext50_64x4d.pdparams',
  45. '063d4b483e12b06388529450ad7576db',
  46. ),
  47. 'resnext101_32x4d': (
  48. 'https://paddle-hapi.bj.bcebos.com/models/resnext101_32x4d.pdparams',
  49. '967b090039f9de2c8d06fe994fb9095f',
  50. ),
  51. 'resnext101_64x4d': (
  52. 'https://paddle-hapi.bj.bcebos.com/models/resnext101_64x4d.pdparams',
  53. '98e04e7ca616a066699230d769d03008',
  54. ),
  55. 'resnext152_32x4d': (
  56. 'https://paddle-hapi.bj.bcebos.com/models/resnext152_32x4d.pdparams',
  57. '18ff0beee21f2efc99c4b31786107121',
  58. ),
  59. 'resnext152_64x4d': (
  60. 'https://paddle-hapi.bj.bcebos.com/models/resnext152_64x4d.pdparams',
  61. '77c4af00ca42c405fa7f841841959379',
  62. ),
  63. 'wide_resnet50_2': (
  64. 'https://paddle-hapi.bj.bcebos.com/models/wide_resnet50_2.pdparams',
  65. '0282f804d73debdab289bd9fea3fa6dc',
  66. ),
  67. 'wide_resnet101_2': (
  68. 'https://paddle-hapi.bj.bcebos.com/models/wide_resnet101_2.pdparams',
  69. 'd4360a2d23657f059216f5d5a1a9ac93',
  70. ),
  71. }
  72. class BasicBlock(nn.Layer):
  73. expansion = 1
  74. def __init__(
  75. self,
  76. inplanes,
  77. planes,
  78. stride=1,
  79. downsample=None,
  80. groups=1,
  81. base_width=64,
  82. dilation=1,
  83. norm_layer=None,
  84. ):
  85. super().__init__()
  86. if norm_layer is None:
  87. norm_layer = nn.BatchNorm2D
  88. if dilation > 1:
  89. raise NotImplementedError(
  90. "Dilation > 1 not supported in BasicBlock"
  91. )
  92. self.conv1 = nn.Conv2D(
  93. inplanes, planes, 3, padding=1, stride=stride, bias_attr=False
  94. )
  95. self.bn1 = norm_layer(planes)
  96. self.relu = nn.ReLU()
  97. self.conv2 = nn.Conv2D(planes, planes, 3, padding=1, bias_attr=False)
  98. self.bn2 = norm_layer(planes)
  99. self.downsample = downsample
  100. self.stride = stride
  101. def forward(self, x):
  102. identity = x
  103. out = self.conv1(x)
  104. out = self.bn1(out)
  105. out = self.relu(out)
  106. out = self.conv2(out)
  107. out = self.bn2(out)
  108. if self.downsample is not None:
  109. identity = self.downsample(x)
  110. out += identity
  111. out = self.relu(out)
  112. return out
  113. class BottleneckBlock(nn.Layer):
  114. expansion = 4
  115. def __init__(
  116. self,
  117. inplanes,
  118. planes,
  119. stride=1,
  120. downsample=None,
  121. groups=1,
  122. base_width=64,
  123. dilation=1,
  124. norm_layer=None,
  125. ):
  126. super().__init__()
  127. if norm_layer is None:
  128. norm_layer = nn.BatchNorm2D
  129. width = int(planes * (base_width / 64.0)) * groups
  130. self.conv1 = nn.Conv2D(inplanes, width, 1, bias_attr=False)
  131. self.bn1 = norm_layer(width)
  132. self.conv2 = nn.Conv2D(
  133. width,
  134. width,
  135. 3,
  136. padding=dilation,
  137. stride=stride,
  138. groups=groups,
  139. dilation=dilation,
  140. bias_attr=False,
  141. )
  142. self.bn2 = norm_layer(width)
  143. self.conv3 = nn.Conv2D(
  144. width, planes * self.expansion, 1, bias_attr=False
  145. )
  146. self.bn3 = norm_layer(planes * self.expansion)
  147. self.relu = nn.ReLU()
  148. self.downsample = downsample
  149. self.stride = stride
  150. def forward(self, x):
  151. identity = x
  152. out = self.conv1(x)
  153. out = self.bn1(out)
  154. out = self.relu(out)
  155. out = self.conv2(out)
  156. out = self.bn2(out)
  157. out = self.relu(out)
  158. out = self.conv3(out)
  159. out = self.bn3(out)
  160. if self.downsample is not None:
  161. identity = self.downsample(x)
  162. out += identity
  163. out = self.relu(out)
  164. return out
  165. class ResNet(nn.Layer):
  166. """ResNet model from
  167. `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.
  168. Args:
  169. Block (BasicBlock|BottleneckBlock): Block module of model.
  170. depth (int, optional): Layers of ResNet, Default: 50.
  171. width (int, optional): Base width per convolution group for each convolution block, Default: 64.
  172. num_classes (int, optional): Output dim of last fc layer. If num_classes <= 0, last fc layer
  173. will not be defined. Default: 1000.
  174. with_pool (bool, optional): Use pool before the last fc layer or not. Default: True.
  175. groups (int, optional): Number of groups for each convolution block, Default: 1.
  176. Returns:
  177. :ref:`api_paddle_nn_Layer`. An instance of ResNet model.
  178. Examples:
  179. .. code-block:: python
  180. >>> import paddle
  181. >>> from paddle.vision.models import ResNet
  182. >>> from paddle.vision.models.resnet import BottleneckBlock, BasicBlock
  183. >>> # build ResNet with 18 layers
  184. >>> resnet18 = ResNet(BasicBlock, 18)
  185. >>> # build ResNet with 50 layers
  186. >>> resnet50 = ResNet(BottleneckBlock, 50)
  187. >>> # build Wide ResNet model
  188. >>> wide_resnet50_2 = ResNet(BottleneckBlock, 50, width=64*2)
  189. >>> # build ResNeXt model
  190. >>> resnext50_32x4d = ResNet(BottleneckBlock, 50, width=4, groups=32)
  191. >>> x = paddle.rand([1, 3, 224, 224])
  192. >>> out = resnet18(x)
  193. >>> print(out.shape)
  194. [1, 1000]
  195. """
  196. def __init__(
  197. self,
  198. block,
  199. depth=50,
  200. width=64,
  201. num_classes=1000,
  202. with_pool=True,
  203. groups=1,
  204. ):
  205. super().__init__()
  206. layer_cfg = {
  207. 18: [2, 2, 2, 2],
  208. 34: [3, 4, 6, 3],
  209. 50: [3, 4, 6, 3],
  210. 101: [3, 4, 23, 3],
  211. 152: [3, 8, 36, 3],
  212. }
  213. layers = layer_cfg[depth]
  214. self.groups = groups
  215. self.base_width = width
  216. self.num_classes = num_classes
  217. self.with_pool = with_pool
  218. self._norm_layer = nn.BatchNorm2D
  219. self.inplanes = 64
  220. self.dilation = 1
  221. self.conv1 = nn.Conv2D(
  222. 3,
  223. self.inplanes,
  224. kernel_size=7,
  225. stride=2,
  226. padding=3,
  227. bias_attr=False,
  228. )
  229. self.bn1 = self._norm_layer(self.inplanes)
  230. self.relu = nn.ReLU()
  231. self.maxpool = nn.MaxPool2D(kernel_size=3, stride=2, padding=1)
  232. self.layer1 = self._make_layer(block, 64, layers[0])
  233. self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
  234. self.layer3 = self._make_layer(block, 256, layers[2], stride=2)
  235. self.layer4 = self._make_layer(block, 512, layers[3], stride=2)
  236. if with_pool:
  237. self.avgpool = nn.AdaptiveAvgPool2D((1, 1))
  238. if num_classes > 0:
  239. self.fc = nn.Linear(512 * block.expansion, num_classes)
  240. def _make_layer(self, block, planes, blocks, stride=1, dilate=False):
  241. norm_layer = self._norm_layer
  242. downsample = None
  243. previous_dilation = self.dilation
  244. if dilate:
  245. self.dilation *= stride
  246. stride = 1
  247. if stride != 1 or self.inplanes != planes * block.expansion:
  248. downsample = nn.Sequential(
  249. nn.Conv2D(
  250. self.inplanes,
  251. planes * block.expansion,
  252. 1,
  253. stride=stride,
  254. bias_attr=False,
  255. ),
  256. norm_layer(planes * block.expansion),
  257. )
  258. layers = []
  259. layers.append(
  260. block(
  261. self.inplanes,
  262. planes,
  263. stride,
  264. downsample,
  265. self.groups,
  266. self.base_width,
  267. previous_dilation,
  268. norm_layer,
  269. )
  270. )
  271. self.inplanes = planes * block.expansion
  272. for _ in range(1, blocks):
  273. layers.append(
  274. block(
  275. self.inplanes,
  276. planes,
  277. groups=self.groups,
  278. base_width=self.base_width,
  279. norm_layer=norm_layer,
  280. )
  281. )
  282. return nn.Sequential(*layers)
  283. def forward(self, x):
  284. x = self.conv1(x)
  285. x = self.bn1(x)
  286. x = self.relu(x)
  287. x = self.maxpool(x)
  288. x = self.layer1(x)
  289. x = self.layer2(x)
  290. x = self.layer3(x)
  291. x = self.layer4(x)
  292. if self.with_pool:
  293. x = self.avgpool(x)
  294. if self.num_classes > 0:
  295. x = paddle.flatten(x, 1)
  296. x = self.fc(x)
  297. return x
  298. def _resnet(arch, Block, depth, pretrained, **kwargs):
  299. model = ResNet(Block, depth, **kwargs)
  300. if pretrained:
  301. assert (
  302. arch in model_urls
  303. ), f"{arch} model do not have a pretrained model now, you should set pretrained=False"
  304. weight_path = get_weights_path_from_url(
  305. model_urls[arch][0], model_urls[arch][1]
  306. )
  307. param = paddle.load(weight_path)
  308. model.set_dict(param)
  309. return model
  310. def resnet18(pretrained=False, **kwargs):
  311. """ResNet 18-layer model from
  312. `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.
  313. Args:
  314. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  315. on ImageNet. Default: False.
  316. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  317. Returns:
  318. :ref:`api_paddle_nn_Layer`. An instance of ResNet 18-layer model.
  319. Examples:
  320. .. code-block:: python
  321. >>> import paddle
  322. >>> from paddle.vision.models import resnet18
  323. >>> # build model
  324. >>> model = resnet18()
  325. >>> # build model and load imagenet pretrained weight
  326. >>> # model = resnet18(pretrained=True)
  327. >>> x = paddle.rand([1, 3, 224, 224])
  328. >>> out = model(x)
  329. >>> print(out.shape)
  330. [1, 1000]
  331. """
  332. return _resnet('resnet18', BasicBlock, 18, pretrained, **kwargs)
  333. def resnet34(pretrained=False, **kwargs):
  334. """ResNet 34-layer model from
  335. `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.
  336. Args:
  337. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  338. on ImageNet. Default: False.
  339. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  340. Returns:
  341. :ref:`api_paddle_nn_Layer`. An instance of ResNet 34-layer model.
  342. Examples:
  343. .. code-block:: python
  344. >>> import paddle
  345. >>> from paddle.vision.models import resnet34
  346. >>> # build model
  347. >>> model = resnet34()
  348. >>> # build model and load imagenet pretrained weight
  349. >>> # model = resnet34(pretrained=True)
  350. >>> x = paddle.rand([1, 3, 224, 224])
  351. >>> out = model(x)
  352. >>> print(out.shape)
  353. [1, 1000]
  354. """
  355. return _resnet('resnet34', BasicBlock, 34, pretrained, **kwargs)
  356. def resnet50(pretrained=False, **kwargs):
  357. """ResNet 50-layer model from
  358. `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.
  359. Args:
  360. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  361. on ImageNet. Default: False.
  362. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  363. Returns:
  364. :ref:`api_paddle_nn_Layer`. An instance of ResNet 50-layer model.
  365. Examples:
  366. .. code-block:: python
  367. >>> import paddle
  368. >>> from paddle.vision.models import resnet50
  369. >>> # build model
  370. >>> model = resnet50()
  371. >>> # build model and load imagenet pretrained weight
  372. >>> # model = resnet50(pretrained=True)
  373. >>> x = paddle.rand([1, 3, 224, 224])
  374. >>> out = model(x)
  375. >>> print(out.shape)
  376. [1, 1000]
  377. """
  378. return _resnet('resnet50', BottleneckBlock, 50, pretrained, **kwargs)
  379. def resnet101(pretrained=False, **kwargs):
  380. """ResNet 101-layer model from
  381. `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.
  382. Args:
  383. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  384. on ImageNet. Default: False.
  385. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  386. Returns:
  387. :ref:`api_paddle_nn_Layer`. An instance of ResNet 101-layer.
  388. Examples:
  389. .. code-block:: python
  390. >>> import paddle
  391. >>> from paddle.vision.models import resnet101
  392. >>> # build model
  393. >>> model = resnet101()
  394. >>> # build model and load imagenet pretrained weight
  395. >>> # model = resnet101(pretrained=True)
  396. >>> x = paddle.rand([1, 3, 224, 224])
  397. >>> out = model(x)
  398. >>> print(out.shape)
  399. [1, 1000]
  400. """
  401. return _resnet('resnet101', BottleneckBlock, 101, pretrained, **kwargs)
  402. def resnet152(pretrained=False, **kwargs):
  403. """ResNet 152-layer model from
  404. `"Deep Residual Learning for Image Recognition" <https://arxiv.org/pdf/1512.03385.pdf>`_.
  405. Args:
  406. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  407. on ImageNet. Default: False.
  408. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  409. Returns:
  410. :ref:`api_paddle_nn_Layer`. An instance of ResNet 152-layer model.
  411. Examples:
  412. .. code-block:: python
  413. >>> import paddle
  414. >>> from paddle.vision.models import resnet152
  415. >>> # build model
  416. >>> model = resnet152()
  417. >>> # build model and load imagenet pretrained weight
  418. >>> # model = resnet152(pretrained=True)
  419. >>> x = paddle.rand([1, 3, 224, 224])
  420. >>> out = model(x)
  421. >>> print(out.shape)
  422. [1, 1000]
  423. """
  424. return _resnet('resnet152', BottleneckBlock, 152, pretrained, **kwargs)
  425. def resnext50_32x4d(pretrained=False, **kwargs):
  426. """ResNeXt-50 32x4d model from
  427. `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
  428. Args:
  429. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  430. on ImageNet. Default: False.
  431. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  432. Returns:
  433. :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-50 32x4d model.
  434. Examples:
  435. .. code-block:: python
  436. >>> import paddle
  437. >>> from paddle.vision.models import resnext50_32x4d
  438. >>> # build model
  439. >>> model = resnext50_32x4d()
  440. >>> # build model and load imagenet pretrained weight
  441. >>> # model = resnext50_32x4d(pretrained=True)
  442. >>> x = paddle.rand([1, 3, 224, 224])
  443. >>> out = model(x)
  444. >>> print(out.shape)
  445. [1, 1000]
  446. """
  447. kwargs['groups'] = 32
  448. kwargs['width'] = 4
  449. return _resnet('resnext50_32x4d', BottleneckBlock, 50, pretrained, **kwargs)
  450. def resnext50_64x4d(pretrained=False, **kwargs):
  451. """ResNeXt-50 64x4d model from
  452. `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
  453. Args:
  454. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  455. on ImageNet. Default: False.
  456. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  457. Returns:
  458. :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-50 64x4d model.
  459. Examples:
  460. .. code-block:: python
  461. >>> import paddle
  462. >>> from paddle.vision.models import resnext50_64x4d
  463. >>> # build model
  464. >>> model = resnext50_64x4d()
  465. >>> # build model and load imagenet pretrained weight
  466. >>> # model = resnext50_64x4d(pretrained=True)
  467. >>> x = paddle.rand([1, 3, 224, 224])
  468. >>> out = model(x)
  469. >>> print(out.shape)
  470. [1, 1000]
  471. """
  472. kwargs['groups'] = 64
  473. kwargs['width'] = 4
  474. return _resnet('resnext50_64x4d', BottleneckBlock, 50, pretrained, **kwargs)
  475. def resnext101_32x4d(pretrained=False, **kwargs):
  476. """ResNeXt-101 32x4d model from
  477. `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
  478. Args:
  479. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  480. on ImageNet. Default: False.
  481. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  482. Returns:
  483. :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-101 32x4d model.
  484. Examples:
  485. .. code-block:: python
  486. >>> import paddle
  487. >>> from paddle.vision.models import resnext101_32x4d
  488. >>> # build model
  489. >>> model = resnext101_32x4d()
  490. >>> # build model and load imagenet pretrained weight
  491. >>> # model = resnext101_32x4d(pretrained=True)
  492. >>> x = paddle.rand([1, 3, 224, 224])
  493. >>> out = model(x)
  494. >>> print(out.shape)
  495. [1, 1000]
  496. """
  497. kwargs['groups'] = 32
  498. kwargs['width'] = 4
  499. return _resnet(
  500. 'resnext101_32x4d', BottleneckBlock, 101, pretrained, **kwargs
  501. )
  502. def resnext101_64x4d(pretrained=False, **kwargs):
  503. """ResNeXt-101 64x4d model from
  504. `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
  505. Args:
  506. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  507. on ImageNet. Default: False.
  508. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  509. Returns:
  510. :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-101 64x4d model.
  511. Examples:
  512. .. code-block:: python
  513. >>> import paddle
  514. >>> from paddle.vision.models import resnext101_64x4d
  515. >>> # build model
  516. >>> model = resnext101_64x4d()
  517. >>> # build model and load imagenet pretrained weight
  518. >>> # model = resnext101_64x4d(pretrained=True)
  519. >>> x = paddle.rand([1, 3, 224, 224])
  520. >>> out = model(x)
  521. >>> print(out.shape)
  522. [1, 1000]
  523. """
  524. kwargs['groups'] = 64
  525. kwargs['width'] = 4
  526. return _resnet(
  527. 'resnext101_64x4d', BottleneckBlock, 101, pretrained, **kwargs
  528. )
  529. def resnext152_32x4d(pretrained=False, **kwargs):
  530. """ResNeXt-152 32x4d model from
  531. `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
  532. Args:
  533. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  534. on ImageNet. Default: False.
  535. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  536. Returns:
  537. :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-152 32x4d model.
  538. Examples:
  539. .. code-block:: python
  540. >>> import paddle
  541. >>> from paddle.vision.models import resnext152_32x4d
  542. >>> # build model
  543. >>> model = resnext152_32x4d()
  544. >>> # build model and load imagenet pretrained weight
  545. >>> # model = resnext152_32x4d(pretrained=True)
  546. >>> x = paddle.rand([1, 3, 224, 224])
  547. >>> out = model(x)
  548. >>> print(out.shape)
  549. [1, 1000]
  550. """
  551. kwargs['groups'] = 32
  552. kwargs['width'] = 4
  553. return _resnet(
  554. 'resnext152_32x4d', BottleneckBlock, 152, pretrained, **kwargs
  555. )
  556. def resnext152_64x4d(pretrained=False, **kwargs):
  557. """ResNeXt-152 64x4d model from
  558. `"Aggregated Residual Transformations for Deep Neural Networks" <https://arxiv.org/pdf/1611.05431.pdf>`_.
  559. Args:
  560. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  561. on ImageNet. Default: False.
  562. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  563. Returns:
  564. :ref:`api_paddle_nn_Layer`. An instance of ResNeXt-152 64x4d model.
  565. Examples:
  566. .. code-block:: python
  567. >>> import paddle
  568. >>> from paddle.vision.models import resnext152_64x4d
  569. >>> # build model
  570. >>> model = resnext152_64x4d()
  571. >>> # build model and load imagenet pretrained weight
  572. >>> # model = resnext152_64x4d(pretrained=True)
  573. >>> x = paddle.rand([1, 3, 224, 224])
  574. >>> out = model(x)
  575. >>> print(out.shape)
  576. [1, 1000]
  577. """
  578. kwargs['groups'] = 64
  579. kwargs['width'] = 4
  580. return _resnet(
  581. 'resnext152_64x4d', BottleneckBlock, 152, pretrained, **kwargs
  582. )
  583. def wide_resnet50_2(pretrained=False, **kwargs):
  584. """Wide ResNet-50-2 model from
  585. `"Wide Residual Networks" <https://arxiv.org/pdf/1605.07146.pdf>`_.
  586. Args:
  587. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  588. on ImageNet. Default: False.
  589. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  590. Returns:
  591. :ref:`api_paddle_nn_Layer`. An instance of Wide ResNet-50-2 model.
  592. Examples:
  593. .. code-block:: python
  594. >>> import paddle
  595. >>> from paddle.vision.models import wide_resnet50_2
  596. >>> # build model
  597. >>> model = wide_resnet50_2()
  598. >>> # build model and load imagenet pretrained weight
  599. >>> # model = wide_resnet50_2(pretrained=True)
  600. >>> x = paddle.rand([1, 3, 224, 224])
  601. >>> out = model(x)
  602. >>> print(out.shape)
  603. [1, 1000]
  604. """
  605. kwargs['width'] = 64 * 2
  606. return _resnet('wide_resnet50_2', BottleneckBlock, 50, pretrained, **kwargs)
  607. def wide_resnet101_2(pretrained=False, **kwargs):
  608. """Wide ResNet-101-2 model from
  609. `"Wide Residual Networks" <https://arxiv.org/pdf/1605.07146.pdf>`_.
  610. Args:
  611. pretrained (bool, optional): Whether to load pre-trained weights. If True, returns a model pre-trained
  612. on ImageNet. Default: False.
  613. **kwargs (optional): Additional keyword arguments. For details, please refer to :ref:`ResNet <api_paddle_vision_models_ResNet>`.
  614. Returns:
  615. :ref:`api_paddle_nn_Layer`. An instance of Wide ResNet-101-2 model.
  616. Examples:
  617. .. code-block:: python
  618. >>> import paddle
  619. >>> from paddle.vision.models import wide_resnet101_2
  620. >>> # build model
  621. >>> model = wide_resnet101_2()
  622. >>> # build model and load imagenet pretrained weight
  623. >>> # model = wide_resnet101_2(pretrained=True)
  624. >>> x = paddle.rand([1, 3, 224, 224])
  625. >>> out = model(x)
  626. >>> print(out.shape)
  627. [1, 1000]
  628. """
  629. kwargs['width'] = 64 * 2
  630. return _resnet(
  631. 'wide_resnet101_2', BottleneckBlock, 101, pretrained, **kwargs
  632. )