溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

PyTorch如何搭建一維線性回歸模型

發(fā)布時(shí)間:2021-02-19 09:27:30 來(lái)源:億速云 閱讀:180 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了PyTorch如何搭建一維線性回歸模型,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

PyTorch搭建一維線性回歸模型

1)一維線性回歸模型的理論基礎(chǔ)

給定數(shù)據(jù)集PyTorch如何搭建一維線性回歸模型,線性回歸希望能夠優(yōu)化出一個(gè)好的函數(shù)PyTorch如何搭建一維線性回歸模型,使得PyTorch如何搭建一維線性回歸模型能夠和PyTorch如何搭建一維線性回歸模型盡可能接近。

如何才能學(xué)習(xí)到參數(shù)PyTorch如何搭建一維線性回歸模型PyTorch如何搭建一維線性回歸模型呢?很簡(jiǎn)單,只需要確定如何衡量PyTorch如何搭建一維線性回歸模型PyTorch如何搭建一維線性回歸模型之間的差別,我們一般通過(guò)損失函數(shù)(Loss Funciton)來(lái)衡量:PyTorch如何搭建一維線性回歸模型。取平方是因?yàn)榫嚯x有正有負(fù),我們于是將它們變?yōu)槿钦?。這就是著名的均方誤差。我們要做的事情就是希望能夠找到PyTorch如何搭建一維線性回歸模型PyTorch如何搭建一維線性回歸模型,使得:

PyTorch如何搭建一維線性回歸模型

PyTorch如何搭建一維線性回歸模型

均方差誤差非常直觀,也有著很好的幾何意義,對(duì)應(yīng)了常用的歐式距離?,F(xiàn)在要求解這個(gè)連續(xù)函數(shù)的最小值,我們很自然想到的方法就是求它的偏導(dǎo)數(shù),讓它的偏導(dǎo)數(shù)等于0來(lái)估計(jì)它的參數(shù),即:

PyTorch如何搭建一維線性回歸模型

PyTorch如何搭建一維線性回歸模型

求解以上兩式,我們就可以得到最優(yōu)解。

2)代碼實(shí)現(xiàn)

首先,我們需要“制造”出一些數(shù)據(jù)集:

import torch
import matplotlib.pyplot as plt
 
 
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = 3*x + 10 + torch.rand(x.size())
# 上面這行代碼是制造出接近y=3x+10的數(shù)據(jù)集,后面加上torch.rand()函數(shù)制造噪音
 
# 畫(huà)圖
plt.scatter(x.data.numpy(), y.data.numpy())
plt.show()

我們想要擬合的一維回歸模型是PyTorch如何搭建一維線性回歸模型。上面制造的數(shù)據(jù)集也是比較接近這個(gè)模型的,但是為了達(dá)到學(xué)習(xí)效果,人為地加上了torch.rand()值增加一些干擾。

上面人為制造出來(lái)的數(shù)據(jù)集的分布如下:

PyTorch如何搭建一維線性回歸模型

有了數(shù)據(jù),我們就要開(kāi)始定義我們的模型,這里定義的是一個(gè)輸入層和輸出層都只有一維的模型,并且使用了“先判斷后使用”的基本結(jié)構(gòu)來(lái)合理使用GPU加速。

class LinearRegression(nn.Module):
  def __init__(self):
    super(LinearRegression, self).__init__()
    self.linear = nn.Linear(1, 1) # 輸入和輸出的維度都是1
  def forward(self, x):
    out = self.linear(x)
    return out
 
if torch.cuda.is_available():
  model = LinearRegression().cuda()
else:
  model = LinearRegression()

然后我們定義出損失函數(shù)和優(yōu)化函數(shù),這里使用均方誤差作為損失函數(shù),使用梯度下降進(jìn)行優(yōu)化:

criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-2)

接下來(lái),開(kāi)始進(jìn)行模型的訓(xùn)練。

num_epochs = 1000
for epoch in range(num_epochs):
  if torch.cuda.is_available():
    inputs = Variable(x).cuda()
    target = Variable(y).cuda()
  else:
    inputs = Variable(x)
    target = Variable(y)
 
  # 向前傳播
  out = model(inputs)
  loss = criterion(out, target)
 
  # 向后傳播
  optimizer.zero_grad() # 注意每次迭代都需要清零
  loss.backward()
  optimizer.step()
 
  if (epoch+1) %20 == 0:
    print('Epoch[{}/{}], loss:{:.6f}'.format(epoch+1, num_epochs, loss.data[0]))

首先定義了迭代的次數(shù),這里為1000次,先向前傳播計(jì)算出損失函數(shù),然后向后傳播計(jì)算梯度,這里需要注意的是,每次計(jì)算梯度前都要記得將梯度歸零,不然梯度會(huì)累加到一起造成結(jié)果不收斂。為了便于看到結(jié)果,每隔一段時(shí)間輸出當(dāng)前的迭代輪數(shù)和損失函數(shù)。

接下來(lái),我們通過(guò)model.eval()函數(shù)將模型變?yōu)闇y(cè)試模式,然后將數(shù)據(jù)放入模型中進(jìn)行預(yù)測(cè)。最后,通過(guò)畫(huà)圖工具matplotlib看一下我們擬合的結(jié)果,代碼如下:

model.eval()
if torch.cuda.is_available():
  predict = model(Variable(x).cuda())
  predict = predict.data.cpu().numpy()
else:
  predict = model(Variable(x))
  predict = predict.data.numpy()
plt.plot(x.numpy(), y.numpy(), 'ro', label='Original Data')
plt.plot(x.numpy(), predict, label='Fitting Line')
plt.show()

其擬合結(jié)果如下圖:

PyTorch如何搭建一維線性回歸模型

附上完整代碼:

# !/usr/bin/python
# coding: utf8
# @Time  : 2018-07-28 18:40
# @Author : Liam
# @Email  : luyu.real@qq.com
# @Software: PyCharm
#            .::::.
#           .::::::::.
#           :::::::::::
#         ..:::::::::::'
#        '::::::::::::'
#         .::::::::::
#      '::::::::::::::..
#         ..::::::::::::.
#        ``::::::::::::::::
#        ::::``:::::::::'    .:::.
#        ::::'  ':::::'    .::::::::.
#       .::::'   ::::   .:::::::'::::.
#      .:::'    ::::: .:::::::::' ':::::.
#      .::'    :::::.:::::::::'   ':::::.
#     .::'     ::::::::::::::'     ``::::.
#   ...:::      ::::::::::::'       ``::.
#   ```` ':.     ':::::::::'         ::::..
#            '.:::::'          ':'````..
#           美女保佑 永無(wú)BUG
 
import torch
from torch.autograd import Variable
import numpy as np
import random
import matplotlib.pyplot as plt
from torch import nn
 
 
x = torch.unsqueeze(torch.linspace(-1, 1, 100), dim=1)
y = 3*x + 10 + torch.rand(x.size())
# 上面這行代碼是制造出接近y=3x+10的數(shù)據(jù)集,后面加上torch.rand()函數(shù)制造噪音
 
# 畫(huà)圖
# plt.scatter(x.data.numpy(), y.data.numpy())
# plt.show()
class LinearRegression(nn.Module):
  def __init__(self):
    super(LinearRegression, self).__init__()
    self.linear = nn.Linear(1, 1) # 輸入和輸出的維度都是1
  def forward(self, x):
    out = self.linear(x)
    return out
 
if torch.cuda.is_available():
  model = LinearRegression().cuda()
else:
  model = LinearRegression()
 
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-2)
 
num_epochs = 1000
for epoch in range(num_epochs):
  if torch.cuda.is_available():
    inputs = Variable(x).cuda()
    target = Variable(y).cuda()
  else:
    inputs = Variable(x)
    target = Variable(y)
 
  # 向前傳播
  out = model(inputs)
  loss = criterion(out, target)
 
  # 向后傳播
  optimizer.zero_grad() # 注意每次迭代都需要清零
  loss.backward()
  optimizer.step()
 
  if (epoch+1) %20 == 0:
    print('Epoch[{}/{}], loss:{:.6f}'.format(epoch+1, num_epochs, loss.data[0]))
model.eval()
if torch.cuda.is_available():
  predict = model(Variable(x).cuda())
  predict = predict.data.cpu().numpy()
else:
  predict = model(Variable(x))
  predict = predict.data.numpy()
plt.plot(x.numpy(), y.numpy(), 'ro', label='Original Data')
plt.plot(x.numpy(), predict, label='Fitting Line')
plt.show()

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“PyTorch如何搭建一維線性回歸模型”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI