[譯] 使用 PyTorch 在 MNIST 數據集上進行邏輯迴歸

邏輯迴歸(Logistic Regression)既能夠用來描述數據,也能夠用來解釋數據中各個二值變量、類別變量、順序變量、距離變量、比率變量之間的關係[1]。下圖展現了邏輯迴歸線性迴歸的區別。css

Taken from [https://www.sciencedirect.com/topics/nursing-and-health-professions/logistic-regression-analysis](https://www.sciencedirect.com/topics/nursing-and-health-professions/logistic-regression-analysis)

本文將展現如何使用 PyTorch 編寫邏輯迴歸模型。html

咱們將嘗試在 MNIST 數據集上解決分類問題。首先,導入咱們所須要的全部庫:前端

import torch
from torch.autograd import Variable
import torchvision.transforms as transforms
import torchvision.datasets as dsets
複製代碼

在建立模型前,我喜歡列一個以下的步驟表。PyTorch 官網[2]上也有這個步驟列表:python

# 第一步:加載數據集
# 第二步:使數據集可迭代
# 第三步:建立模型類
# 第四步:將模型類實例化
# 第五步:實例化 Loss 類
# 第六步:實例化優化器類
# 第七步:訓練模型
複製代碼

下面咱們將一步步完成上述的步驟。android

加載數據集

咱們使用 torchvision.datasets 來加載數據集。這個庫中包含了幾乎所有的用於機器學習的流行數據集。在[3]中能夠看到完整的數據集列表。ios

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 類,使用如下代碼來讓咱們的數據集可被迭代:git

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)
複製代碼

建立模型類

如今,咱們將建立一個用來定義邏輯迴歸模型結構的類:github

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前端後端區塊鏈產品設計人工智能等領域,想要查看更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章
相關標籤/搜索