基于逻辑回归的PyTorch手写数字识别

逻辑回归是一种非常常用的统计方法,它允许我们从一组自变量中预测二进制输出。逻辑回归的各种属性及其Python实现已在本文中介绍 本文 先前深度学习lib库是脸谱网开发的一个非常流行的深度学习库。 现在,我们将看到如何使用PyTorch中的逻辑回归从MNIST数据集中对手写数字进行分类。首先,需要将Pytork安装到Python环境中。最简单的方法是使用pip或conda工具。参观 皮托克。组织 并安装您想要使用的Python解释器和包管理器的版本。 安装了PyTorch之后,让我们看看代码。编写下面给出的三行代码,以导入所需的库函数和对象。

null

Python3

import torch
import torch.nn as nn
import torchvision.datasets as dsets
import torchvision.transforms as transforms
from torch.autograd import Variable


手电筒nn 模块包含模型所需的代码, 火炬视觉。数据集 包含MNIST数据集。它包含我们将在这里使用的手写数字数据集。这个 火炬视觉。转变 模块包含将对象转换为其他对象的各种方法。在这里,我们将使用它将图像转换为PyTorch张量。还有 手电筒签名 模块中包含变量类,我们将在定义张量时使用它。 接下来,我们将下载数据集并将其加载到内存中。

Python3

# MNIST Dataset (Images and Labels)
train_dataset = dsets.MNIST(root = './data' ,
train = True ,
transform = transforms.ToTensor(),
download = True )
test_dataset = dsets.MNIST(root = './data' ,
train = False ,
transform = transforms.ToTensor())
# Dataset Loader (Input Pipeline)
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 )


现在,我们将定义超参数。

Python3

# Hyper Parameters
input_size = 784
num_classes = 10
num_epochs = 5
batch_size = 100
learning_rate = 0.001


在我们的数据集中,图像大小是28*28。因此,我们的输入大小是784。此外,这里面有10个数字,因此,我们可以有10个不同的输出。因此,我们将num_类设置为10。此外,我们将在整个数据集上进行五次训练。最后,我们将以小批量的方式进行训练,每组100张图像,以防止程序因内存溢出而崩溃。 在此之后,我们将定义我们的模型如下。在这里,我们将把我们的模型初始化为 手电筒nn。单元 然后定义向前传球。在我们正在编写的代码中,softmax是在每次向前传递期间内部计算的,因此我们不需要在forward()函数中指定它。

Python3

class LogisticRegression(nn.Module):
def __init__( self , input_size, num_classes):
super (LogisticRegression, self ).__init__()
self .linear = nn.Linear(input_size, num_classes)
def forward( self , x):
out = self .linear(x)
return out


定义了类之后,现在我们为同一个类实例化一个对象。

Python3

model = LogisticRegression(input_size, num_classes)


接下来,我们设置损失函数和优化器。这里,我们将使用交叉熵损失,对于优化器,我们将使用学习率为0.001的随机梯度下降算法,如上面的超参数所定义。

Python3

criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr = learning_rate)


现在,我们开始训练。在这里,我们将执行以下任务:

  1. 将所有渐变重置为0。
  2. 向前传球。
  3. 计算损失。
  4. 执行反向传播。
  5. 更新所有权重。

Python3

# 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)
# Forward + Backward + Optimize
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[ 0 ]))


最后,我们将使用以下代码测试该模型。

Python3

# Test the Model
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))


假设您正确执行了所有步骤,您将获得82%的准确率,这与当今使用特殊类型神经网络架构的最先进模型相去甚远。作为参考,您可以在下面找到本文的完整代码:

Python3

import torch
import torch.nn as nn
import torchvision.datasets as dsets
import torchvision.transforms as transforms
from torch.autograd import Variable
# MNIST Dataset (Images and Labels)
train_dataset = dsets.MNIST(root = './data' ,
train = True ,
transform = transforms.ToTensor(),
download = True )
test_dataset = dsets.MNIST(root = './data' ,
train = False ,
transform = transforms.ToTensor())
# Dataset Loader (Input Pipeline)
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 )
# Hyper Parameters
input_size = 784
num_classes = 10
num_epochs = 5
batch_size = 100
learning_rate = 0.001
# Model
class LogisticRegression(nn.Module):
def __init__( self , input_size, num_classes):
super (LogisticRegression, self ).__init__()
self .linear = nn.Linear(input_size, num_classes)
def forward( self , x):
out = self .linear(x)
return out
model = LogisticRegression(input_size, num_classes)
# Loss and Optimizer
# Softmax is internally computed.
# Set parameters to be updated.
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr = learning_rate)
# 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)
# Forward + Backward + Optimize
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[ 0 ]))
# Test the Model
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))


工具书类 :

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享