逻辑回归模型是用来描述数据和解释一个因变量和一个或多个名义、序号、间隔或比例等自变量之间的关系。下面的图表显示了逻辑和线性回归之间的区别:
在这篇文章中,我将展示如何在 PyTorch 中编写 Logistic 模型。
我们将尝试解决 MNIST 数据集的分类问题。首先,让我们导入所有我们需要的库。
import torch
from torch.autograd import Variable
import torchvision.transforms as transforms
import torchvision.datasets as dsets
在创建模型时,我更喜欢将以下步骤列表放在眼前。这个列表来自于 PyTorch 官网。
# Step 1. Load Dataset
# Step 2. Make Dataset Iterable
# Step 3. Create Model Class
# Step 4. Instantiate Model Class
# Step 5. Instantiate Loss Class
# Step 6. Instantiate Optimizer Class
# Step 7. Train Model
那么让我们一个一个来看看这些步骤。
加载数据集
为了加载数据集,我们使用了torchvision.datasets,这是一个包含了机器学习中几乎所有流行数据集的数据库。
train_dataset = dsets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=False)
test_dataset = dsets.MNIST(root='./data', train=False, transform=transforms.ToTensor())
使数据集可迭代
我们将使用 DataLoader 类使我们的数据集可迭代使用以下代码行。
train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)
创建模型类
现在,我们将创建一个类来定义 Logistic 回归的体系结构。
class LogisticRegression(torch.nn.Module):
def __init__(self, input_dim, output_dim):
super(LogisticRegression, self).__init__()
self.linear = torch.nn.Linear(input_dim, output_dim)
def forward(self, x):
outputs = self.linear(x)
return outputs
实例化模型类
在实例化之前,我们将初始化一些参数,如下所示。
batch_size = 100
n_iters = 3000
epochs = n_iters / (len(train_dataset) / batch_size)
input_dim = 784
output_dim = 10
lr_rate = 0.001
现在,我们初始化我们的 Logistic 回归模型。
model = LogisticRegression(input_dim, output_dim)
实例化 Loss 类
我们用交叉熵来计算损失。
criterion = torch.nn.CrossEntropyLoss() # computes softmax and then the cross entropy
改进优化器类
优化器将是我们使用的学习算法,在这种情况下,我们将使用随机梯度下降。
optimizer = torch.optim.SGD(model.parameters(), lr=lr_rate)
训练模型
现在,在最后一步中,我们将使用以下代码来训练模型。
iter = 0
for epoch in range(int(epochs)):
for i, (images, labels) in enumerate(train_loader):
images = Variable(images.view(-1, 28 * 28))
labels = Variable(labels)
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
iter+=1
if iter%500==0:
# calculate Accuracy
correct = 0
total = 0
for images, labels in test_loader:
images = Variable(images.view(-1, 28*28))
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total+= labels.size(0)
# for gpu, bring the predicted and labels back to cpu fro python operations to work
correct+= (predicted == labels).sum()
accuracy = 100 * correct/total
print("Iteration: {}. Loss: {}. Accuracy: {}.".format(iter, loss.item(), accuracy))
经过训练,这个模型只需要3000次迭代就可以得到82% 的准确率。您可以继续并稍微调整参数,看看准确性是否提高。
结束语
对 PyTorch 中的 Logistic 回归模型进行更深入的理解的一个好方法就是把它应用到你能想到的任何分类问题上。例如,你可以训练一个 Logistic 回归模型来分类你最喜欢的漫威超级英雄的图像~
· END ·