当前位置:   article > 正文

手把手教你使用PyTorch搭建神经网络_pytorch神经网络搭建

pytorch神经网络搭建

使用PyTorch搭建基本神经网络的分步指南。

微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩

图片

简介

PyTorch是一个强大的深度学习框架,本文将详细介绍使用PyTorch搭建一个基本神经网络所涉及的步骤,并希望能够帮助你提高技能和加深知识。接下来就开始我们的PyTorch之旅吧!

具体步骤

1 - 导入

使用PyTorch搭建神经网络的第一步是导入必要的库和模块。在这个代码片段中,我们导入了PyTorch的torch库,以及其他几个模块,例如nn(用于定义神经网络层)、optim(用于定义优化算法),以及datasetstransforms(用于加载和处理数据)。

  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
  6. import torchvision.datasets as datasets
  7. import torchvision.transforms as transforms

2 - 创建神经网络

一旦我们导入了必要的库和模块,我们就可以定义我们的神经网络模型。在这个例子中,我们使用PyTorch提供的nn.Module类定义了一个全连接的神经网络(也被称为前馈神经网络)。我们定义了两个线性层(nn.Linear),其中有50个(你可以使用不同数量的单元)隐藏单元和一个ReLU激活函数(F.relu),然后是最后一个线性层,其输出大小等于我们要预测的类别数量。

  1. class NeuralNetwork(nn.Module):
  2.     def __init__(selfinput_size, num_classes):
  3.         super(NeuralNetwork, self).__init__()
  4.         self.fc1 = nn.Linear(in_features=input_size, out_features=50)
  5.         self.fc2 = nn.Linear(in_features=50, out_features=num_classes)
  6.     def forward(self, x):
  7.         return self.fc2(F.relu(self.fc1(x)))

3 - 检查正确的形状

检查模型的输出形状以确保它符合期望是一个不可或缺的步骤。在这个例子中,我们创建了一个神经网络模型的实例,并传入一个大小为(64, 784)的随机输入张量来检查模型的输出形状。我们使用.shape属性输出张量的形状。

  1. model = NeuralNetwork(78410)
  2. = torch.rand(64,784)
  3. print(model(x).shape) # Output : torch.Size([6410])

4 - 设置设备

如果我们可以使用GPU,我们应该使用它来加快我们的计算速度。在这段代码中,如果GPU可用,我们将设备设置为cuda,否则为cpu。这对于确保我们的模型和数据在正确的设备上进行处理是很重要的。

device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')

5 - 设置超参数

在训练我们的神经网络之前,我们需要定义一些超参数,例如学习率、批量大小和轮数。在这个例子中,我们定义了一个学习率0.001,一个批量大小64,并训练了10epochs

  1. input_size = 784
  2. num_classes = 10
  3. learning_rate = 0.001
  4. batch_size = 64
  5. num_epochs = 10

6 - 加载数据

为了训练我们的神经网络,我们需要加载和预处理我们的训练和测试数据。在这个例子中,我们使用MNIST数据集(包含手写数字图像)和PyTorch提供的DataLoader类来加载数据。我们还应用ToTensor变换来将图像转换为PyTorch的张量。

  1. train_data = datasets.MNIST(root = "dataset/"
  2.                             train=True
  3.                             transform=transforms.ToTensor(), 
  4.                             download=True
  5.                             )
  6. train_loader = DataLoader(dataset=train_data
  7.                           batch_size=batch_size
  8.                           shuffle=True
  9.                           )
  10. test_data = datasets.MNIST(root = "dataset/"
  11.                            train=False
  12.                            transform=transforms.ToTensor(), 
  13.                            download=True
  14.                            )
  15. test_loader = DataLoader(dataset=test_data
  16.                          batch_size=batch_size
  17.                          shuffle=True
  18.                          )

7 - 初始化网络

一旦我们定义了我们的模型并加载了数据,我们就可以使用.to()方法在正确的设备(如步骤4中定义的)上初始化我们的神经网络模型。

model = NeuralNetwork(input_size=input_size, num_classes=num_classes).to(device)

8 - 定义损失和优化器

为了训练我们的神经网络,我们需要定义一个损失函数和一个优化算法。在这个例子中,我们使用CrossEntropyLoss损失函数和PyTorch提供的Adam优化器。我们还使用model.parameters()方法将模型参数传递给优化器。

  1. criterion = nn.CrossEntropyLoss()
  2. optimizer = optim.Adam(params= model.parameters(), lr=learning_rate)

9 - 训练模型

现在已经定义了我们的模型,加载了数据,并初始化了必要的组件,可以通过分批迭代训练数据来训练我们的神经网络,并使用反向传播更新模型参数。在这段代码中,我们在训练数据上循环了指定数量的epochs,这是对整个训练数据集的完整遍历。在每个历时中,我们使用train_loader数据加载器对象分批迭代数据。对于每个批次,我们将数据和标签移到设备上(GPU或CPU),并将数据重塑为形状扁平的张量(batch_sizeinput_size)。然后我们通过神经网络传递数据,并使用交叉熵损失函数计算损失。我们将优化器的梯度设置为零,使用反向传播计算梯度,并使用优化器的阶跃函数更新参数。这个过程重复进行,直到我们在训练数据集中的所有批次上进行了指定次数的迭代。

  1. for epoch in range(num_epochs):
  2.     for batch_idx, (data, labels) in enumerate(train_loader):
  3.         data = data.to(device=device)
  4.         labels = labels.to(device=device)
  5.         data = data.reshape(data.shape[0], -1)
  6.         scores = model(data)
  7.         loss = criterion(scores, labels)
  8.         optimizer.zero_grad()
  9.         loss.backward()
  10.         optimizer.step()

10-评估模型

训练完模型后,可以在测试数据上评估其性能。我们使用训练好的模型来预测测试数据的标签,并将其与地面真实标签进行比较。然后,我们用正确预测的数量除以预测的总数来计算模型的准确性。

  1. num_correct = 0
  2. num_samples = 0
  3. model.eval()
  4. with torch.no_grad():
  5.     for data, labels in test_loader:
  6.         data = data.to(device=device)
  7.         labels = labels.to(device=device)
  8.         data = data.reshape(data.shape[0],-1)
  9.         scores = model(data)
  10.         _, predictions = torch.max(scores, dim=1)
  11.         num_correct += (predictions == labels).sum()
  12.         num_samples += predictions.size(0)
  13.     print(f'Got {num_correct} / {num_samples} with accuracy {float(num_correct) / float(num_samples)*100:.2f}')
  14. model.train()
Output : Got 9712 / 10000 with accuracy 97.12

注:在PyTorch中,模型有两种模式:训练模式和评估模式。model.eval()方法将模型设置为评估模式,它将关闭某些层或模块,如dropoutbatch normalization。这很重要,因为在评估期间,我们不希望这些层改变我们模型的输出。

另一方面,model.train()将模型设置为训练模式,从而启用那些在评估期间被关闭的层或模块。这很重要,因为我们需要这些层在训练过程中学习并更新它们的参数。

在给定的代码中,我们首先将模型设置为评估模式,然后在测试数据上测试模型。这确保了评估是在没有任何噪音或像dropout这样的层所应用的正则化的情况下进行的。一旦评估完成,我们在继续训练循环之前将模型设置为训练模式。这可以确保在训练过程中应用必要的正则化。

11 - 可视化

接下来让我们在test_loader上可视化一些随机图像。

  1. import matplotlib.pyplot as plt
  2. # 测试并绘制10张随机图像
  3. model.eval()
  4. with torch.no_grad():
  5.     fig, axs = plt.subplots(25, figsize=(126))
  6.     axs = axs.flatten()
  7.     for i, (data, labels) in enumerate(test_loader):
  8.         if i >= 10:  # Break after 10 images
  9.             break
  10.         data = data.to(device=device)
  11.         labels = labels.to(device=device)
  12.         data = data.reshape(data.shape[0], -1)
  13.         scores = model(data)
  14.         _, predictions = torch.max(scores, dim=1)
  15.         # 绘制图像和预测结果
  16.         img = data.cpu().numpy().reshape(-12828)
  17.         axs[i].imshow(img[0], cmap='gray')
  18.         axs[i].set_title(f"Label: {labels[0]} - Prediction: {predictions[0]}")
  19.     plt.tight_layout()
  20.     plt.show()
  21. model.train()

图片

输出(你的可能是不同的,因为他们是随机选择的)。

如下所示是完整的代码,请查收:

  1. # 导入
  2. import torch
  3. import torch.nn as nn
  4. import torch.optim as optim
  5. import torch.nn.functional as F
  6. from torch.utils.data import DataLoader
  7. import torchvision.datasets as datasets
  8. import torchvision.transforms as transforms
  9. # 创建FCN
  10. class NeuralNetwork(nn.Module):
  11.     def __init__(selfinput_size, num_classes):
  12.         super(NeuralNetwork, self).__init__() 
  13.         self.fc1 = nn.Linear(in_features=input_size, out_features=50)
  14.         self.fc2 = nn.Linear(in_features=50, out_features=num_classes)
  15.     def forward(self, x):
  16.         return self.fc2(F.relu(self.fc1(x)))
  17. # 检查它的形状是否正确
  18. model = NeuralNetwork(78410)
  19. = torch.rand(64,784)
  20. print(model(x).shape)
  21. # 设置设备
  22. device = torch.device('cuda' if torch.cuda.is_available() else 'cpu'
  23. print(device)
  24. # 设置超参数
  25. input_size = 784
  26. num_classes = 10
  27. learning_rate = 0.001
  28. batch_size = 64
  29. num_epochs = 1
  30. # 加载数据
  31. train_data = datasets.MNIST(root = "dataset/", train=True, transform=transforms.ToTensor(), download=True)
  32. train_loader = DataLoader(dataset=train_data, batch_size=batch_size, shuffle=True)
  33. test_data = datasets.MNIST(root = "dataset/", train=False, transform=transforms.ToTensor(), download=True)
  34. test_loader = DataLoader(dataset=test_data, batch_size=batch_size, shuffle=True)
  35. # 初始化网络
  36. model = NeuralNetwork(input_size=input_size, num_classes=num_classes).to(device) 
  37. # 损失和优化器
  38. criterion = nn.CrossEntropyLoss()
  39. optimizer = optim.Adam(params= model.parameters(), lr=learning_rate)
  40. # 训练
  41. for epoch in range(num_epochs):
  42.     for batch_idx, (data, labels) in enumerate(train_loader):
  43.         data = data.to(device=device)
  44.         labels = labels.to(device=device)
  45.         data = data.reshape(data.shape[0], -1
  46.         scores = model(data)
  47.         loss = criterion(scores, labels)
  48.         optimizer.zero_grad() 
  49.         loss.backward() 
  50.         optimizer.step() 
  51. # 测试
  52. num_correct = 0
  53. num_samples = 0
  54. model.eval() 
  55. with torch.no_grad():
  56.     for data, labels in test_loader:
  57.         data = data.to(device=device)
  58.         labels = labels.to(device=device)
  59.         data = data.reshape(data.shape[0],-1)
  60.         scores = model(data)
  61.         _, predictions = torch.max(scores, dim=1)
  62.         num_correct += (predictions == labels).sum()
  63.         num_samples += predictions.size(0)
  64.     print(f'Got {num_correct} / {num_samples} with accuracy {float(num_correct) / float(num_samples)*100:.2f}')
  65. model.train()
  66. import matplotlib.pyplot as plt
  67. # 测试并绘制10张随机图像
  68. model.eval()
  69. with torch.no_grad():
  70.     fig, axs = plt.subplots(25, figsize=(126))
  71.     axs = axs.flatten()
  72.     for i, (data, labels) in enumerate(test_loader):
  73.         if i >= 10:  # Break after 10 images
  74.             break
  75.         data = data.to(device=device)
  76.         labels = labels.to(device=device)
  77.         data = data.reshape(data.shape[0], -1)
  78.         scores = model(data)
  79.         _, predictions = torch.max(scores, dim=1)
  80.         # 绘制图像和预测结果
  81.         img = data.cpu().numpy().reshape(-12828)
  82.         axs[i].imshow(img[0], cmap='gray')
  83.         axs[i].set_title(f"Label: {labels[0]} - Prediction: {predictions[0]}")
  84.     plt.tight_layout()
  85.     plt.show()
  86. model.train()

总结

在本教程中,我们已经了解了如何使用PyTorch建立一个用于图像分类的简单神经网络。我们首先加载了MNIST数据集,进而定义了神经网络的架构。然后,我们使用训练数据对模型进行了训练,并评估了它在测试数据上的表现。我们还讨论了一些重要的概念,例如设备放置、前向和后向传递、损失函数和优化算法。本教程为那些对深度学习和PyTorch感兴趣的人提供了一个良好的起点。

推荐书单

《PyTorch深度学习简明实战》

本书针对深度学习及开源框架——PyTorch,采用简明的语言进行知识的讲解,注重实战。全书分为4篇,共19章。深度学习基础篇(第1章~第6章)包括PyTorch简介与安装、机器学习基础与线性回归、张量与数据类型、分类问题与多层感知器、多层感知器模型与模型训练、梯度下降法、反向传播算法与内置优化器。计算机视觉篇(第7章~第14章)包括计算机视觉与卷积神经网络、卷积入门实例、图像读取与模型保存、多分类问题与卷积模型的优化、迁移学习与数据增强、经典网络模型与特征提取、图像定位基础、图像语义分割。自然语言处理和序列篇(第15章~第17章)包括文本分类与词嵌入、循环神经网络与一维卷积神经网络、序列预测实例。生成对抗网络和目标检测篇(第18章~第19章)包括生成对抗网络、目标检测。

本书适合人工智能行业的软件工程师、对人工智能感兴趣的学生学习,同时也可作为深度学习的培训教程。

《PyTorch深度学习简明实战》(日月光华)【摘要 书评 试读】- 京东图书京东JD.COM图书频道为您提供《PyTorch深度学习简明实战》在线选购,本书作者:,出版社:清华大学出版社。买图书,到京东。网购图书,享受最低优惠折扣!icon-default.png?t=N6B9https://item.jd.com/13512395.html

图片

精彩回顾

《GPT4ALL:终极开源大语言模型解决方案》

《使用TensorFlow和Keras创建猫狗图片深度学习分类器》

《使用Python和OpenPlayground轻松探索大语言模型》

《使用TensorFlow和Keras,轻松搭建并训练你的第一个神经网络》

《ChatGPT的背后原理:大模型、注意力机制、强化学习》

《ChatGPT和Bard太贵,介绍8个免费开源的大模型解决方案!》

微信搜索关注《Python学研大本营》,加入读者群

访问【IT今日热榜】,发现每日技术热点

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

闽ICP备14008679号