首頁 > 軟體

基於Pytorch的神經網路之Regression的實現

2022-03-15 13:03:06

1.引言

我們之前已經介紹了神經網路的基本知識,神經網路的主要作用就是預測與分類,現在讓我們來搭建第一個用於擬合迴歸的神經網路吧。

2.神經網路搭建

2.1 準備工作

要搭建擬合神經網路並繪圖我們需要使用python的幾個庫。

import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
 
x = torch.unsqueeze(torch.linspace(-5, 5, 100), dim=1)
y = x.pow(3) + 0.2 * torch.rand(x.size())

 既然是擬合,我們當然需要一些資料啦,我選取了在區間  內的100個等間距點,並將它們排列成三次函數的影象。

2.2 搭建網路

我們定義一個類,繼承了封裝在torch中的一個模組,我們先分別確定輸入層、隱藏層、輸出層的神經元數目,繼承父類別後再使用torch中的.nn.Linear()函數進行輸入層到隱藏層的線性變換,隱藏層也進行線性變換後傳入輸出層predict,接下來定義前向傳播的函數forward(),使用relu()作為啟用函數,最後輸出predict()結果即可。

class Net(torch.nn.Module):
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()
        self.hidden = torch.nn.Linear(n_feature, n_hidden)
        self.predict = torch.nn.Linear(n_hidden, n_output)
    def forward(self, x):
        x = F.relu(self.hidden(x))
        return self.predict(x)
net = Net(1, 20, 1)
print(net)
optimizer = torch.optim.Adam(net.parameters(), lr=0.2)
loss_func = torch.nn.MSELoss()

網路的框架搭建完了,然後我們傳入三層對應的神經元數目再定義優化器,這裡我選取了Adam而隨機梯度下降(SGD),因為它是SGD的優化版本,效果在大部分情況下比SGD好,我們要傳入這個神經網路的引數(parameters),並定義學習率(learning rate),學習率通常選取小於1的數,需要憑藉經驗並不斷偵錯。最後我們選取均方差法(MSE)來計算損失(loss)。

2.3 訓練網路

接下來我們要對我們搭建好的神經網路進行訓練,我訓練了2000輪(epoch),先更新結果prediction再計算損失,接著清零梯度,然後根據loss反向傳播(backward),最後進行優化,找出最優的擬合曲線。

for t in range(2000):
    prediction = net(x)
    loss = loss_func(prediction, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

3.效果

使用如下繪圖的程式碼展示效果。

for t in range(2000):
    prediction = net(x)
    loss = loss_func(prediction, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if t % 5 == 0:
        plt.cla()
        plt.scatter(x.data.numpy(), y.data.numpy(), s=10)
        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=2)
        plt.text(2, -100, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 10, 'color': 'red'})
        plt.pause(0.1)
plt.ioff()
plt.show()

最後的結果: 

4. 完整程式碼

import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
 
x = torch.unsqueeze(torch.linspace(-5, 5, 100), dim=1)
y = x.pow(3) + 0.2 * torch.rand(x.size())
class Net(torch.nn.Module):
    def __init__(self, n_feature, n_hidden, n_output):
        super(Net, self).__init__()
        self.hidden = torch.nn.Linear(n_feature, n_hidden)
        self.predict = torch.nn.Linear(n_hidden, n_output)
    def forward(self, x):
        x = F.relu(self.hidden(x))
        return self.predict(x)
net = Net(1, 20, 1)
print(net)
optimizer = torch.optim.Adam(net.parameters(), lr=0.2)
loss_func = torch.nn.MSELoss()
plt.ion()
for t in range(2000):
    prediction = net(x)
    loss = loss_func(prediction, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if t % 5 == 0:
        plt.cla()
        plt.scatter(x.data.numpy(), y.data.numpy(), s=10)
        plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=2)
        plt.text(2, -100, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 10, 'color': 'red'})
        plt.pause(0.1)
plt.ioff()
plt.show()

到此這篇關於基於Pytorch的神經網路之Regression的實現的文章就介紹到這了,更多相關 Pytorch Regression內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com