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

lsvih發表於2019-04-29

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

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 編寫邏輯迴歸模型。

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

相關文章