深度学习新手指南:用PyTorch搭建神经网络
本文为深度学习新手提供了一个使用PyTorch搭建简单神经网络的入门指南。PyTorch以其动态图机制和简洁API著称,适合初学者快速上手。文章首先介绍了PyTorch的核心特性,包括动态图机制、自动微分和丰富的API。接着,详细讲解了如何准备环境、加载和预处理MNIST数据集,并定义了一个包含两个隐藏层的全连接神经网络模型。随后,通过交叉熵损失函数和随机梯度下降优化器进行模型训练,并在测试集上评
对于深度学习新手来说,搭建一个简单的神经网络是入门的最佳实践。PyTorch是一个非常流行的深度学习框架,以其灵活的动态图机制和简洁的API而闻名。本文将从零开始,带你用PyTorch搭建一个简单的神经网络,并用它来完成一个经典的分类任务。无论你是深度学习的新手,还是对PyTorch感兴趣的小白,这篇文章都会帮助你快速上手!

一、PyTorch简介
PyTorch是一个开源的深度学习框架,由Facebook的AI研究团队开发。它提供了强大的自动微分功能和灵活的动态图机制,使得构建和训练神经网络变得非常直观和高效。PyTorch的核心特性包括:
-
动态图机制:PyTorch使用动态图,允许用户在运行时动态修改计算图,这使得调试和实验更加灵活。
-
自动微分:PyTorch提供了自动微分功能,自动计算梯度,大大简化了神经网络的训练过程。
-
丰富的API:PyTorch提供了丰富的API,支持多种神经网络层和优化算法,方便用户构建复杂的模型。
二、环境准备
在开始之前,确保你的Python环境中安装了PyTorch。如果尚未安装,可以通过以下命令安装:
bash
复制
pip install torch torchvision
此外,我们还需要安装matplotlib库,用于可视化数据和训练过程:
bash
复制
pip install matplotlib
三、搭建一个简单的神经网络
我们将通过一个简单的分类任务来演示如何用PyTorch搭建神经网络。我们将使用经典的MNIST手写数字数据集,这是一个包含70,000张28x28像素的手写数字图像的数据集,分为10个类别(0-9)。
(一)加载和预处理数据
首先,我们加载MNIST数据集,并对其进行预处理。
Python
复制
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
# 数据预处理
transform = transforms.Compose([
transforms.ToTensor(), # 将图像转换为Tensor
transforms.Normalize((0.5,), (0.5,)) # 归一化
])
# 加载MNIST数据集
trainset = torchvision.datasets.MNIST(root='./data', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
testset = torchvision.datasets.MNIST(root='./data', train=False, download=True, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False)
# 可视化一些训练图像
def imshow(img):
img = img / 2 + 0.5 # 反归一化
npimg = img.numpy()
plt.imshow(np.transpose(npimg, (1, 2, 0)))
plt.show()
# 获取一批训练图像
dataiter = iter(trainloader)
images, labels = next(dataiter)
# 显示图像
imshow(torchvision.utils.make_grid(images))
# 打印标签
print(' '.join(f'{labels[j].item():5d}' for j in range(4)))
(二)定义神经网络模型
接下来,我们定义一个简单的神经网络模型。我们将使用一个包含两个隐藏层的全连接神经网络。
Python
复制
import torch.nn as nn
import torch.nn.functional as F
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc1 = nn.Linear(28 * 28, 128) # 输入层到隐藏层1
self.fc2 = nn.Linear(128, 64) # 隐藏层1到隐藏层2
self.fc3 = nn.Linear(64, 10) # 隐藏层2到输出层
def forward(self, x):
x = x.view(-1, 28 * 28) # 将图像展平为一维向量
x = F.relu(self.fc1(x)) # 第一层激活函数
x = F.relu(self.fc2(x)) # 第二层激活函数
x = self.fc3(x) # 输出层
return x
# 实例化模型
net = SimpleNN()
(三)训练神经网络
现在,我们开始训练模型。我们将使用交叉熵损失函数和随机梯度下降(SGD)优化器。
Python
复制
import torch.optim as optim
# 损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)
# 训练模型
num_epochs = 10
for epoch in range(num_epochs):
running_loss = 0.0
for i, data in enumerate(trainloader, 0):
inputs, labels = data
# 梯度清零
optimizer.zero_grad()
# 前向传播
outputs = net(inputs)
loss = criterion(outputs, labels)
# 反向传播和优化
loss.backward()
optimizer.step()
running_loss += loss.item()
if i % 100 == 99: # 每100个批次打印一次
print(f'[Epoch {epoch + 1}, Batch {i + 1}] Loss: {running_loss / 100:.3f}')
running_loss = 0.0
print('Finished Training')
(四)测试神经网络
训练完成后,我们在测试集上评估模型的性能。
Python
复制
correct = 0
total = 0
with torch.no_grad(): # 测试过程中不需要计算梯度
for data in testloader:
images, labels = data
outputs = net(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f'Accuracy of the network on the 10000 test images: {100 * correct / total:.2f}%')
(五)可视化测试结果
我们还可以可视化一些测试图像及其预测结果。
Python
复制
dataiter = iter(testloader)
images, labels = next(dataiter)
# 显示图像
imshow(torchvision.utils.make_grid(images))
# 打印标签
print('GroundTruth: ', ' '.join(f'{labels[j].item():5d}' for j in range(4)))
# 预测结果
outputs = net(images)
_, predicted = torch.max(outputs, 1)
print('Predicted: ', ' '.join(f'{predicted[j].item():5d}' for j in range(4)))
四、总结
通过以上步骤,我们从零开始实现了一个简单的神经网络,并用它完成了MNIST手写数字的分类任务。PyTorch提供了强大的工具和简洁的API,使得深度学习模型的构建和训练变得非常容易。希望这篇文章能帮助你更好地理解深度学习的基本概念和操作。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)