以下是“PyTorch一小时掌握之神经网络分类篇”的完整攻略,包括两个示例说明。
示例1:使用全连接神经网络对MNIST数据集进行分类
首先,我们需要加载MNIST数据集,并将其分为训练集和测试集。然后,我们定义一个全连接神经网络,包含两个隐藏层和一个输出层。我们使用ReLU激活函数和交叉熵损失函数,并使用随机梯度下降优化器进行训练。
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
# 加载MNIST数据集
train_dataset = datasets.MNIST(root='data/', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.MNIST(root='data/', train=False, transform=transforms.ToTensor(), download=True)
# 定义超参数
input_size = 784
hidden_size = 128
num_classes = 10
num_epochs = 10
batch_size = 100
learning_rate = 0.001
# 定义全连接神经网络
class Net(nn.Module):
def __init__(self, input_size, hidden_size, num_classes):
super(Net, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, hidden_size)
self.relu = nn.ReLU()
self.fc3 = nn.Linear(hidden_size, num_classes)
def forward(self, x):
x = x.view(-1, input_size)
x = self.relu(self.fc1(x))
x = self.relu(self.fc2(x))
x = self.fc3(x)
return x
# 创建模型实例、损失函数和优化器
model = Net(input_size, hidden_size, num_classes)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)
# 训练模型
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
# 前向传播
outputs = model(images)
loss = criterion(outputs, labels)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 打印损失
if (i+1) % 100 == 0:
print(f"Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}")
# 测试模型
with torch.no_grad():
correct = 0
total = 0
for images, labels in test_loader:
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f"Accuracy: {100 * correct / total}%")
在这个示例中,我们首先加载MNIST数据集,并将其分为训练集和测试集。然后,我们定义了一个全连接神经网络,包含两个隐藏层和一个输出层。我们使用ReLU激活函数和交叉熵损失函数,并使用随机梯度下降优化器进行训练。在训练过程中,我们使用一个循环遍历训练集中的所有数据,并计算损失和梯度。最后,我们使用测试集评估模型的准确性。
示例2:使用卷积神经网络对CIFAR-10数据集进行分类
首先,我们需要加载CIFAR-10数据集,并将其分为训练集和测试集。然后,我们定义一个卷积神经网络,包含两个卷积层和两个全连接层。我们使用ReLU激活函数和交叉熵损失函数,并使用Adam优化器进行训练。
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
# 加载CIFAR-10数据集
train_dataset = datasets.CIFAR10(root='data/', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.CIFAR10(root='data/', train=False, transform=transforms.ToTensor(), download=True)
# 定义超参数
num_classes = 10
num_epochs = 10
batch_size = 100
learning_rate = 0.001
# 定义卷积神经网络
class Net(nn.Module):
def __init__(self, num_classes):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(3, 32, 3, padding=1)
self.relu = nn.ReLU()
self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
self.pool = nn.MaxPool2d(2, 2)
self.fc1 = nn.Linear(64 * 8 * 8, 512)
self.fc2 = nn.Linear(512, num_classes)
def forward(self, x):
x = self.relu(self.conv1(x))
x = self.pool(self.relu(self.conv2(x)))
x = x.view(-1, 64 * 8 * 8)
x = self.relu(self.fc1(x))
x = self.fc2(x)
return x
# 创建模型实例、损失函数和优化器
model = Net(num_classes)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=learning_rate)
# 训练模型
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
# 前向传播
outputs = model(images)
loss = criterion(outputs, labels)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 打印损失
if (i+1) % 100 == 0:
print(f"Epoch [{epoch+1}/{num_epochs}], Step [{i+1}/{len(train_loader)}], Loss: {loss.item():.4f}")
# 测试模型
with torch.no_grad():
correct = 0
total = 0
for images, labels in test_loader:
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
print(f"Accuracy: {100 * correct / total}%")
在这个示例中,我们首先加载CIFAR-10数据集,并将其分为训练集和测试集。然后,我们定义了一个卷积神经网络,包含两个卷积层和两个全连接层。我们使用ReLU激活函数和交叉熵损失函数,并使用Adam优化器进行训练。在训练过程中,我们使用一个循环遍历训练集中的所有数据,并计算损失和梯度。最后,我们使用测试集评估模型的准确性。
总之,PyTorch提供了丰富的工具和函数来实现神经网络分类。我们可以使用nn.Linear
和nn.Conv2d
函数来定义全连接层和卷积层,使用nn.ReLU
函数来定义ReLU激活函数,使用nn.CrossEntropyLoss
函数来定义交叉熵损失函数,使用optim.SGD
和optim.Adam
函数来定义优化器。在训练过程中,我们需要使用一个循环遍历数据集中的所有数据,并计算损失和梯度。最后,我们使用测试集评估模型的准确性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch一小时掌握之神经网络分类篇 - Python技术站