[译] 使用 PyTorch 在 MNIST 数据集上进行逻辑回归

栏目: 数据库 · 发布时间: 5年前

内容简介:逻辑回归(Logistic Regression)本文将展示如何使用 PyTorch 编写逻辑回归模型。我们将尝试在 MNIST 数据集上解决分类问题。首先,导入我们所需要的所有库:

逻辑回归(Logistic Regression) 既可以用来描述数据,也可以用来解释数据中各个二值变量、类别变量、顺序变量、距离变量、比率变量之间的关系[1]。下图展示了 逻辑回归 与 线性回归 的区别。

[译] 使用 PyTorch 在 MNIST 数据集上进行逻辑回归

本文将展示如何使用 PyTorch 编写逻辑回归模型。

我们将尝试在 MNIST 数据集上解决分类问题。首先,导入我们所需要的所有库:

import torch
from torch.autograd import Variable
import torchvision.transforms as transforms
import torchvision.datasets as dsets
复制代码

在创建模型前,我喜欢列一个如下的步骤表。PyTorch 官网[2]上也有这个步骤列表:

# 第一步:加载数据集
# 第二步:使数据集可迭代
# 第三步:创建模型类
# 第四步:将模型类实例化
# 第五步:实例化 Loss 类
# 第六步:实例化优化器类
# 第七步:训练模型
复制代码

下面我们将一步步完成上述的步骤。

加载数据集

我们使用 torchvision.datasets 来加载数据集。这个库中包含了几乎全部的用于机器学习的流行数据集。在[3]中可以看到完整的数据集列表。

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)
复制代码

创建模型类

现在,我们将创建一个用来定义逻辑回归模型结构的类:

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
复制代码

然后,就能初始化我们的逻辑回归模型了:

model = LogisticRegression(input_dim, output_dim)
复制代码

实例化 Loss 类

我们使用交叉熵损失来计算 loss:

criterion = torch.nn.CrossEntropyLoss() # 计算 softmax 分布之上的交叉熵损失
复制代码

实例化优化器类

优化器(optimizer)就是我们即将使用的学习算法。在本例中,我们将使用随机梯度下降(SGD)作为优化器:

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:
            # 计算准确率
            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)
                # 如果用的是 GPU,则要把预测值和标签都取回 CPU,才能用  Python  来计算
                correct+= (predicted == labels).sum()
            accuracy = 100 * correct/total
            print("Iteration: {}. Loss: {}. Accuracy: {}.".format(iter, loss.item(), accuracy))
复制代码

在训练时,这个模型只需要进行 3000 次迭代就能达到 82% 的准确率。你可以试着继续调整一下参数,看看还能不能把准确率再调高一点。

如果你想加深对在 PyTorch 中实现逻辑回归的理解,可以把上面的模型应用于任何分类问题。比如,你可以训练一个逻辑回归模型来对你最喜爱的 漫威英雄 的图像做个分类(有一半已经化灰了,所以做分类应该不是很难):)

引用

[1] www.statisticssolutions.com/what-is-log…

[2] pytorch.org/tutorials/b…

[3] pytorch.org/docs/stable…

如果发现译文存在错误或其他需要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可获得相应奖励积分。文章开头的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。

掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能 等领域,想要查看更多优质译文请持续关注 掘金翻译计划 、官方微博、 知乎专栏


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

让云落地

让云落地

【美】Michael J. Kavis(迈克尔 J.凯维斯) 著 / 陈志伟、辛敏 / 电子工业出版社 / 2016-3 / 65.00元

云计算落地已成事实。从前几年的概念普及,到如今越来越多的企业将业务迁移至云上,云计算正在改变整个社会的信息资源使用观念和方式。云计算还在不断成长,技术细节也在不断变化之中。对于使用者而言,能够基于自身的业务、技术和组织需求等各方面情况,选择正确的云服务模式,是成功使用云计算最关键的技术决策之一。 《让云落地:云计算服务模式(SaaS、PaaS和IaaS)设计决策》共有 16 章,作者有意避开......一起来看看 《让云落地》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换