PyTorch深度学习:从ResNet34到ResNet18

作者:热心市民鹿先生2023.09.26 12:50浏览量:4

简介:PyTorch中搭建ResNet34与ResNet18模型的源代码

PyTorch中搭建ResNet34与ResNet18模型的源代码
深度学习的应用中,图像识别和分类是一个重要的领域。为了解决这个问题,我们通常会使用预训练的深度学习模型,比如ResNet。在本文中,我们将详细解释如何在PyTorch中搭建ResNet34和ResNet18模型。

  1. ResNet34
    首先,我们从ResNet34开始。以下是一个简单的源代码示例:
    1. import torch
    2. import torch.nn as nn
    3. class ResNet34(nn.Module):
    4. def __init__(self, num_classes=1000):
    5. super(ResNet34, self).__init__()
    6. self.features = nn.Sequential(
    7. nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3),
    8. nn.BatchNorm2d(64),
    9. nn.ReLU(inplace=True),
    10. nn.MaxPool2d(kernel_size=3, stride=2, padding=1),
    11. self._block(64, 3, 4),
    12. self._block(128, 4, 6),
    13. self._block(256, 6, 3),
    14. nn.AdaptiveAvgPool2d((1, 1)),
    15. nn.Flatten(),
    16. nn.Linear(256 * 1 * 1, num_classes),
    17. )
    18. def forward(self, x):
    19. x = self.features(x)
    20. return x
    21. def _block(self, channels, num_layers, num_layers_per_residual_group):
    22. layers = []
    23. for i in range(num_layers):
    24. if i % num_layers_per_residual_group == 0:
    25. layers += [nn.Conv2d(channels, channels * 2, kernel_size=3, stride=1, padding=1), nn.BatchNorm2d(channels * 2), nn.ReLU(inplace=True)]
    26. channels *= 2
    27. else:
    28. layers += [nn.Conv2d(channels, channels, kernel_size=3, stride=1, padding=1), nn.BatchNorm2d(channels), nn.ReLU(inplace=True)]
    29. return nn.Sequential(*layers)
    此处代码首先定义了一个ResNet34类,它是一个继承自nn.Module的类。在初始化函数__init__中,定义了特征提取的主干网络部分,包括卷积、归一化、激活和最大池化等操作。然后在forward函数中进行前向传播。最后定义了用于构建ResNet34模型的残差块。
  2. ResNet18
    接下来,我们来看看如何实现ResNet18模型。以下是一个简单的源代码示例:
    ```python
    import torch
    import torch.nn as nn
    class ResNet18(nn.Module):
    def init(self, numclasses=1000):
    super(ResNet18, self)._init
    ()
    self.features = nn.Sequential(
    nn.Conv2d(3, 64, kernel_size=3, stride=2, padding=1),
    nn.BatchNorm2d(64),
    nn.ReLU(inplace=True),
    nn._block(64, 2, 2),
    nn._block(128, 2, 2),
    nn._block(256, 2, 2),
    nn._block(512, 2, 2),
    nn.AdaptiveAvgPool2d((1, 1)),
    nn.Flatten(),
    nn.Linear(512 1 1, num_classes),
    )
    def forward(self, x):
    x = self.features(x)
    return x
    def _block(self, channels, num_layers):
    layers = []
    for i in range(num_layers):
    if i == 0:
    layers += [nn.Conv2d(channels , channels 4 , kernel_size = 3 , stride = 1 , padding = 1), nn.BatchNorm2d(channels 4), nn.ReLU()] #conv—>BN—>relu