1. 程式人生 > 其它 >【專案實戰】pytorch實現邏輯斯蒂迴歸

【專案實戰】pytorch實現邏輯斯蒂迴歸

視訊指導:https://www.bilibili.com/video/BV1Y7411d7Ys?p=6

一些資料集

在pytorch框架下,裡面面有配套的資料集,pytorch裡面有一個torchversion的包,他可以提供相應的,比如MNIST這種很基礎的資料集,但是安裝的時候這些資料集不會包含在包裡面,所以需要下載,具體程式碼以及解釋如下:

import torchvision
train_set = torchvision.datasets.MNIST(root= '../dataset/mnist', train=True, download=True) //root後面表示把資料集安裝在什麼位置,train表示是要訓練集還是測試集,download表示是否需要下載(如果沒有下載就需要下載)
text_set = torchvision.datasets.MNIST(root= '../dataset/mnist', train=False, download=True)

還有一個叫做CIFAR-10 的資料集,訓練集裡面包含了5w個樣本,測試集包含了1w個樣本,內容就是一些圖片,被分成了十類,分別表示不同的事務

import torchvision
train_set = torchvision.datasets.CIFAR10(...)
text_set = torchvision.datasets.CIFAR10(...)

邏輯斯蒂迴歸

首先我們自己設計幾個資料

x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]])

然後開始設計模型

class LogisiticRegressionModel(torch.nn.Module):
    def __init__(self):
        super(LogisiticRegressionModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)

    def forward(self,x):
        y_pred = F.sigmoid(self.linear(x))
        return y_pred

這裡和昨天不一樣的地方在於forward裡面使用了邏輯斯蒂迴歸
然後是優化器和損失函式

model = LogisiticRegressionModel()
critertion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(),lr=0.01)

損失函式採用的是BCE,就是交叉熵損失
開始訓練

for epoch in range(1000):
    y_pred = model(x_data)
    loss = critertion(y_pred,y_data)
    print(epoch, loss.item())

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

結果視覺化

用matplotlib進行繪圖可以使結果視覺化,具體程式碼和解釋如下

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 10, 200)           //意思就是在0到10之間弄出來兩百個點
x_t = torch.Tensor(x).view((200, 1))  //把他變成200行一列的矩陣
y_t = model(x_t)                      //送入模型
y = y_t.data.numpy()                  //用numpy接收y_data的資料
plt.plot(x, y)                        //繪圖
plt.plot([0, 10], [0.5, 0.5], c='r')  //表示在0到10,0.5到0.5上面畫一條線(顯然是一條直線)
plt.ylabel('probability of pass')
plt.grid()
plt.show()

總結

第一遍跑有一個警告

UserWarning: nn.functional.sigmoid is deprecated. Use torch.sigmoid instead. warnings.warn

查了一下,把

F.sigmoid(self.hidden(x)) 
#修改成以下語句
torch.sigmoid(self.hidden(x))

即可
估計是版本問題吧
然後我有魔改了一下程式碼,具體如下

import torch

x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[0], [0], [1]])

class LogisiticRegressionModel(torch.nn.Module):
    def __init__(self):
        super(LogisiticRegressionModel, self).__init__()
        self.linear = torch.nn.Linear(1, 1)

    def forward(self,x):
        y_pred = torch.sigmoid(self.linear(x))
        return y_pred

model = LogisiticRegressionModel()
critertion = torch.nn.BCELoss(size_average=False)
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)


for epoch in range(50000):
    y_pred = model(x_data)
    loss = critertion(y_pred,y_data)
    print(epoch, loss.item())

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 100, 2000)
x_t = torch.Tensor(x).view((2000, 1))
y_t = model(x_t)
y = y_t.data.numpy()
plt.plot(x, y)
plt.plot([0, 100], [0.5, 0.5], c='r')
plt.xlabel('hours')
plt.ylabel('pass')
plt.grid()
plt.show()

最後的結果,我願稱之為,過擬合之王

哈哈哈哈哈,很有意思

  • 總之整個程式碼編寫就分這幾步:
  • 準備資料;
  • 設計模型;
  • 構造損失函式和優化器;
  • 訓練過程;
  • 列印結果
    熟悉了就可以搞出自己的模型了