当前位置:   article > 正文

人工智能(Pytorch)搭建模型6-使用Pytorch搭建卷积神经网络ResNet模型_pytorch restnet34模型调用

pytorch restnet34模型调用

大家好,我是微学AI,今天给大家介绍一下人工智能(Pytorch)搭建模型6-使用Pytorch搭建卷积神经网络ResNet模型,在本文中,我们将学习如何使用PyTorch搭建卷积神经网络ResNet模型,并在生成的假数据上进行训练和测试。本文将涵盖这些内容:ResNet模型简介、ResNet模型结构、生成假数据、实现ResNet模型、训练与测试模型。

一、ResNet模型简介

ResNet(残差网络)模型是由何恺明等人在2015年提出的一种深度卷积神经网络。它的主要创新是引入了残差结构,通过这种结构,ResNet可以有效地解决深度神经网络难以训练的问题。ResNet在多个图像分类任务上取得了非常好的效果,包括ImageNet大规模视觉识别挑战赛。ResNet模型使得卷积神经网络不受到层数的限制,解决了层数越深,模型预测结果越差的情况。

二、ResNet模型结构

ResNet的核心思想是引入残差块,残差块的输入不仅直接传给下一层,而且还通过一个跳跃连接(Skip Connection)直接连接到后面的层。这种结构可以有效地缓解梯度消失问题,使得网络可以被有效地训练。

一个典型的残差块包含两个卷积层、两个激活函数和一个跳跃连接。ResNet网络的层数可以通过堆叠不同数量的残差块来实现,例如常见的ResNet-18、ResNet-34、ResNet-50、ResNet-101和ResNet-152等。

59448bf4644146d3961ad57b50d4a5e7.png

三、生成假数据

为了演示模型的训练和测试,我们将在本文中使用生成的假数据。我们将生成一个包含1000个3通道32x32图像的数据集,使用随机数来表示图像像素值,并为每个图像分配一个介于0到9之间的类别标签。

四、实现ResNet模型

接下来,我们将使用PyTorch框架实现一个简化版的ResNet-18模型。首先,我们需要导入所需的库:

  1. import torch
  2. import torch.nn as nn
  3. import torch.optim as optim
  4. import torch.nn.functional as F
  5. from torch.utils.data import DataLoader, TensorDataset
  6. import numpy as np
  7. class ResidualBlock(nn.Module):
  8. def __init__(self, in_channels, out_channels, stride=1):
  9. super(ResidualBlock, self).__init__()
  10. self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)
  11. self.bn1 = nn.BatchNorm2d(out_channels)
  12. self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)
  13. self.bn2 = nn.BatchNorm2d(out_channels)
  14. self.skip_connection = nn.Sequential()
  15. if stride != 1 or in_channels != out_channels:
  16. self.skip_connection = nn.Sequential(
  17. nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride, bias=False),
  18. nn.BatchNorm2d(out_channels)
  19. )
  20. def forward(self, x):
  21. out = F.relu(self.bn1(self.conv1(x)))
  22. out = self.bn2(self.conv2(out))
  23. out += self.skip_connection(x)
  24. out = F.relu(out)
  25. return out
  26. class ResNet(nn.Module):
  27. def __init__(self, block, num_classes=10):
  28. super(ResNet, self).__init__()
  29. self.in_channels = 64
  30. self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1, bias=False)
  31. self.bn1 = nn.BatchNorm2d(64)
  32. self.layer1 = self._make_layer(block, 64, stride=1)
  33. self.layer2 = self._make_layer(block, 128, stride=2)
  34. self.layer3 = self._make_layer(block, 256, stride=2)
  35. self.layer4 = self._make_layer(block, 512, stride=2)
  36. self.avg_pool = nn.AdaptiveAvgPool2d((1, 1))
  37. self.fc = nn.Linear(512, num_classes)
  38. def _make_layer(self, block, out_channels, stride):
  39. layers = [block(self.in_channels, out_channels, stride)]
  40. self.in_channels = out_channels
  41. layers.append(block(out_channels, out_channels))
  42. return nn.Sequential(*layers)
  43. def forward(self, x):
  44. x = F.relu(self.bn1(self.conv1(x)))
  45. x = self.layer1(x)
  46. x = self.layer2(x)
  47. x = self.layer3(x)
  48. x = self.layer4(x)
  49. x = self.avg_pool(x)
  50. x = x.view(x.size(0), -1)
  51. x = self.fc(x)
  52. return x

残差连接图: 

8c9a04aad4174dd1bafd61d10dfd9cb8.png

五、训练与测试模型

现在我们创建数据集、模型、损失函数和优化器,然后进行训练:

  1. # 生成假数据
  2. num_samples = 1000
  3. image_data = np.random.rand(num_samples, 3, 32, 32).astype(np.float32)
  4. labels = np.random.randint(0, 10, size=num_samples, dtype=np.int64)
  5. # 创建数据集和数据加载器
  6. train_data = TensorDataset(torch.from_numpy(image_data), torch.from_numpy(labels))
  7. train_loader = DataLoader(train_data, batch_size=64, shuffle=True)
  8. # 创建模型、损失函数和优化器
  9. device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
  10. model = ResNet(ResidualBlock).to(device)
  11. criterion = nn.CrossEntropyLoss()
  12. optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.9)
  13. # 训练模型
  14. num_epochs = 10
  15. for epoch in range(num_epochs):
  16. model.train()
  17. running_loss = 0.0
  18. for i, (images, labels) in enumerate(train_loader):
  19. images = images.to(device)
  20. labels = labels.to(device)
  21. optimizer.zero_grad()
  22. outputs = model(images)
  23. loss = criterion(outputs, labels)
  24. loss.backward()
  25. optimizer.step()
  26. running_loss += loss.item()
  27. print(f"Epoch [{epoch + 1}/{num_epochs}], Loss: {running_loss / (i + 1)}")
  28. # 测试模型
  29. model.eval()
  30. with torch.no_grad():
  31. correct = 0
  32. total = 0
  33. for images, labels in train_loader:
  34. images = images.to(device)
  35. labels = labels.to(device)
  36. outputs = model(images)
  37. _, predicted = torch.max(outputs.data, 1)
  38. total += labels.size(0)
  39. correct += (predicted == labels).sum().item()
  40. print(f"Accuracy of the model on the {total} test images: {100 * correct / total}%")

六、总结

文章详细介绍了如何使用PyTorch搭建卷积神经网络ResNet模型,并在生成的假数据上进行训练和测试。通过实现简化版的ResNet-18模型,我们了解了残差块的结构和原理,以及如何利用残差结构有效地训练深度神经网络。在实际应用中,可以通过调整模型结构和参数,以及使用真实的数据集来进一步提升模型的性能。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/121901
推荐阅读
相关标签
  

闽ICP备14008679号