如何在PyTorch中使用Logistic Regression来识别手写数字

359 阅读4分钟

在PyTorch中使用Logistic Regression来识别手写数字

Logistic回归是一种广泛使用的统计方法,用于从一组自变量中预测二元结果。本文介绍了逻辑回归的各种属性及其Python实现。

简介

首先,我们将看看在PyTorch中的实现。然后,我们将使用Logistic回归对MNIST数据集中的手写数字进行分类。

前提条件

  1. 在你的Python环境中安装PyTorch
  2. Python编程概念

库函数和对象

在你的代码中导入库函数和对象,以获得实现神经网络所需的功能。下面是我们导入的函数和对象。

  • torch.nn模块。包含我们将在我们的模型中使用的代码。
  • Thetorchvision.datasets。包括我们将在这里使用的MNIST手写数字数据集。
  • torchvision.transforms。我们将使用它来将图像转换为PyTorch张量。
  • torch.autograd。允许快速而直接地计算多个偏导数。

输入下面的代码来导入库中的函数和对象。

import torch
import torch.nn as tn
import torch.nn.functional as tF
import torch.optim as optim
import torchvision.datasets as dsets
import torchvision.transforms as transforms
from torch.autograd import Variable

导入后,我们下载并加载数据集到内存。这将在下面的代码中完成。

# MNIST Dataset 
train_dataset = dsets.MNIST(root ='./data',train = True, download = True)

test_dataset = dsets.MNIST(root ='./data', train = False, transform = transforms.ToTensor())

# Dataset Loader 
train_loader = torch.utils.data.DataLoader(dataset = train_dataset, shuffle = True)

test_loader = torch.utils.data.DataLoader(dataset = test_dataset,shuffle = False)

定义我们的超参数

让我们定义我们的超参数。

input_size = 784
num_classes = 10
num_epochs = 5
batch_size = 100
learning_rate = 0.001

我们将使用的图像大小为28*28。这意味着我们的输入大小将是784。此外,这里面有十个数字。因此,我们可以产生十个备选结果。

这样一来,number_classes ,将被设定为十位。此外,我们将通过五次迭代训练来运行完整的数据集。然后,我们将分小批训练,每批100张图片,这样软件就不会因为内存溢出而崩溃。之后,我们将以如下方式布置我们的模型。

在这一节中,我们将在把我们的模型设置为torch.nn.Module的一个子类后定义前向传递。由于我们正在构建代码,我们不需要在**forward()**函数中提到softmax。它将在每次正向运行时内部确定。

class LogisticRegression(tn.Module):
    def __init__(self, input_size, num_classes):
        super(LogisticRegression, self).__init__()
        self.linear = tn.Linear(input_size, num_classes)

    def forward(self, x):
        out = self.linear(x)
        return out

现在我们的类已经建立,我们可以创建一个实例。

model = LogisticRegression(input_size, num_classes)

建立神经网络

我们的损失函数和优化器现在已经设定。正如上面的超参数中所指定的,我们将使用交叉熵损失随机梯度下降算法来优化。

让我们为我们正在开发的网络建立一个新的类。

# create a new class for the network
class NeuralNetwork(tn.Module):
# constructing our network with two-dimensional convolutional layers, followed by two fully-connected layers
   def __init__(self):
      super(NeuralNetwork, self).__init__()
      self.c1 = tn.Conv2d(1, 10, kernel_size=5)
      self.c2 = tn.Conv2d(10, 20, kernel_size=5)
      self.c2_drop = tn.Dropout2d()
      self.fch1 = tn.Linear(320, 50)
      self.fch2 = tn.Linear(50, 10)

   def forward(self, b):
      b = tF.relu(tF.max_pool2d(self.c1(b), 2))
      b = tF.relu(tF.max_pool2d(self.c2_drop(self.c2(b)), 2))
      b = b.view(-1, 320)
      b = tF.relu(self.fch1(b))
      b = tF.dropout(b, trai=self.training)
      b = self.fch2(b)
      return tF.log_softmax(b)

为了让网络和优化器启动和运行。

criterion = tn.CrossEntropyLoss()
network = NeuralNetwork()
opti = torch.optim.SGD(newmodel.parameters(), lr = reading_rate)

我们现在准备开始训练。将所有梯度重设为0将是第一步,接下来是正向传递、损失计算、反向传播和更新权重。

Dataloader将加载各个批次的数据。我们使用optimizer.zero_grad(). 将梯度设置为零。backward() 调用现在将收集一组新的梯度,我们使用optimizer.step() 将其传播回网络的每个参数中。

# Training the Model
for epoch in range(num_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()

        if (i + 1) % 100 == 0:
            print('Epoch: [% d/% d], Step: [% d/% d], Loss: %.4f'% (epoch + 1, num_epochs, i + 1, len(train_dataset) // batch_size, loss.data))

现在我们将使用下面的代码来运行这个模型。

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)
    correct += (predicted == labels).sum()

print('Accuracy of the model on the 10000 test images: % d %%' % (
            100 * correct / total))

换句话说,我按照步骤得到了91%的结果,这明显低于目前的最佳模型,它也使用了不同类型的神经网络架构。

额外信息

从各种媒体(如照片、文件和触摸显示器)中识别人类手写数字并进行分类,被称为手写数字识别(0-9)。在深度学习中,这一直是研究的重点。

深度学习/CNN、SVM和高斯天真贝叶斯只是识别手写数字的几种算法。

Logistic回归在统计软件中被用来估计概率,以更好地理解因变量和一个或多个自变量之间的关系。例如,这种类型的分析可以预测一个事件发生的可能性或一个决定被做出的可能性。

结论

在Logistic Regression和PyTorch的帮助下,我们了解了MNIST手写数字的识别方法。

在数据文件夹中,最初下载的是MNIST数据集。然后设置超参数,加载到环境中,并构建成一个神经网络。然后可以定义和使用逻辑回归模型。这里使用MNIST数据集来训练和测试该模型。