【專案實戰】pytorch實現邏輯斯蒂迴歸
阿新 • • 發佈:2022-04-12
視訊指導: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()
最後的結果,我願稱之為,過擬合之王
哈哈哈哈哈,很有意思
- 總之整個程式碼編寫就分這幾步:
- 準備資料;
- 設計模型;
- 構造損失函式和優化器;
- 訓練過程;
- 列印結果
熟悉了就可以搞出自己的模型了