以下是PyTorch: Softmax多分类实战操作的完整攻略,包含两个示例说明。
环境要求
在开始实战操作之前,需要确保您的系统满足以下要求:
- Python 3.6或更高版本
- PyTorch 1.0或更高版本
- torchvision 0.2.1或更高版本
示例1:使用Softmax多分类模型对MNIST数据集进行分类
在这个示例中,我们将使用Softmax多分类模型对MNIST数据集进行分类。
首先,我们需要下载MNIST数据集。您可以使用以下代码来下载MNIST数据集:
import torchvision.datasets as dsets
import torchvision.transforms as transforms
train_dataset = dsets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = dsets.MNIST(root='./data', train=False, transform=transforms.ToTensor())
然后,我们可以使用以下代码来定义一个Softmax多分类模型:
import torch.nn as nn
import torch.nn.functional as F
class SoftmaxClassifier(nn.Module):
def __init__(self):
super(SoftmaxClassifier, self).__init__()
self.linear = nn.Linear(784, 10)
def forward(self, x):
x = x.view(-1, 784)
x = self.linear(x)
return F.softmax(x, dim=1)
接下来,我们可以使用以下代码来训练Softmax多分类模型:
import torch.optim as optim
model = SoftmaxClassifier()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=100, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=100, shuffle=False)
num_epochs = 10
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
if (i+1) % 100 == 0:
print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, len(train_dataset)//100, loss.item()))
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('Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total))
在这个示例中,我们首先定义了一个Softmax多分类模型。然后,我们使用该模型对MNIST数据集进行分类,并在测试集上计算模型的准确率。
示例2:使用Softmax多分类模型对CIFAR-10数据集进行分类
在这个示例中,我们将使用Softmax多分类模型对CIFAR-10数据集进行分类。
首先,我们需要下载CIFAR-10数据集。您可以使用以下代码来下载CIFAR-10数据集:
import torchvision.datasets as dsets
import torchvision.transforms as transforms
train_dataset = dsets.CIFAR10(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = dsets.CIFAR10(root='./data', train=False, transform=transforms.ToTensor())
然后,我们可以使用以下代码来定义一个Softmax多分类模型:
import torch.nn as nn
import torch.nn.functional as F
class SoftmaxClassifier(nn.Module):
def __init__(self):
super(SoftmaxClassifier, self).__init__()
self.conv1 = nn.Conv2d(3, 6, 5)
self.pool = nn.MaxPool2d(2, 2)
self.conv2 = nn.Conv2d(6, 16, 5)
self.fc1 = nn.Linear(16 * 5 * 5, 120)
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
x = self.pool(F.relu(self.conv1(x)))
x = self.pool(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return F.softmax(x, dim=1)
接下来,我们可以使用以下代码来训练Softmax多分类模型:
import torch.optim as optim
model = SoftmaxClassifier()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=100, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=100, shuffle=False)
num_epochs = 10
for epoch in range(num_epochs):
for i, (images, labels) in enumerate(train_loader):
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
if (i+1) % 100 == 0:
print ('Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, i+1, len(train_dataset)//100, loss.item()))
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('Accuracy of the model on the 10000 test images: {} %'.format(100 * correct / total))
在这个示例中,我们首先定义了一个Softmax多分类模型。然后,我们使用该模型对CIFAR-10数据集进行分类,并在测试集上计算模型的准确率。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PyTorch: Softmax多分类实战操作 - Python技术站