下图显示了逻辑和线性回归之间的差异。
在这篇文章中,我将展示如何在PyTorch中编写逻辑回归模型。
我们将尝试解决MNIST数据集的分类问题。首先,让我们导入所需的所有库。
#Step 1.加载数据集
#Step 2.使数据集可以迭代
#Step 3.创建模型类
#Step 4.实例化模型类
#Step 5.实例化损失类
#Step 6.实例化优化器类
#Step 7.训练模型
让我们一个接一个地完成这些步骤。
加载数据集
为了加载数据集,我们使用了torchvision.datasets,这个库几乎包含了机器学习中使用的所有流行数据集。您可以查看完整的数据集列表(https://pytorch.org/docs/stable/torchvision/datasets.html)
使数据集可重复使用
我们将使用DataLoader类使用以下代码使数据集可迭代。
创建模型类
现在,我们将创建一个定义逻辑回归体系结构的类。
实例化模型类
在实例化之前,我们将初始化一些参数,如下所示。
现在,我们初始化逻辑回归模型。
model = LogisticRegression(input_dim, output_dim)
实例化损失类
我们使用交叉熵来计算损失。
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中更好地理解逻辑回归模型的一个很好的练习是将它应用于您能想到的任何分类问题。例如,你可以训练一个逻辑回归模型来对你喜欢的漫威超级英雄的图像进行分类(应该不会很难,因为其中有一半已经消失)。