91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-02-19 09:27:30 來源:億速云 閱讀:180 作者:小新 欄目:開發技術

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

PyTorch搭建一維線性回歸模型

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

給定數據集PyTorch如何搭建一維線性回歸模型,線性回歸希望能夠優化出一個好的函數PyTorch如何搭建一維線性回歸模型,使得PyTorch如何搭建一維線性回歸模型能夠和PyTorch如何搭建一維線性回歸模型盡可能接近。

如何才能學習到參數PyTorch如何搭建一維線性回歸模型PyTorch如何搭建一維線性回歸模型呢?很簡單,只需要確定如何衡量PyTorch如何搭建一維線性回歸模型PyTorch如何搭建一維線性回歸模型之間的差別,我們一般通過損失函數(Loss Funciton)來衡量:PyTorch如何搭建一維線性回歸模型。取平方是因為距離有正有負,我們于是將它們變為全是正的。這就是著名的均方誤差。我們要做的事情就是希望能夠找到PyTorch如何搭建一維線性回歸模型PyTorch如何搭建一維線性回歸模型,使得:

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

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

均方差誤差非常直觀,也有著很好的幾何意義,對應了常用的歐式距離。現在要求解這個連續函數的最小值,我們很自然想到的方法就是求它的偏導數,讓它的偏導數等于0來估計它的參數,即:

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

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

求解以上兩式,我們就可以得到最優解。

2)代碼實現

首先,我們需要“制造”出一些數據集:

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的數據集,后面加上torch.rand()函數制造噪音
 
# 畫圖
plt.scatter(x.data.numpy(), y.data.numpy())
plt.show()

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

上面人為制造出來的數據集的分布如下:

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

有了數據,我們就要開始定義我們的模型,這里定義的是一個輸入層和輸出層都只有一維的模型,并且使用了“先判斷后使用”的基本結構來合理使用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()

然后我們定義出損失函數和優化函數,這里使用均方誤差作為損失函數,使用梯度下降進行優化:

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]))

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

接下來,我們通過model.eval()函數將模型變為測試模式,然后將數據放入模型中進行預測。最后,通過畫圖工具matplotlib看一下我們擬合的結果,代碼如下:

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()

其擬合結果如下圖:

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

附上完整代碼:

# !/usr/bin/python
# coding: utf8
# @Time  : 2018-07-28 18:40
# @Author : Liam
# @Email  : luyu.real@qq.com
# @Software: PyCharm
#            .::::.
#           .::::::::.
#           :::::::::::
#         ..:::::::::::'
#        '::::::::::::'
#         .::::::::::
#      '::::::::::::::..
#         ..::::::::::::.
#        ``::::::::::::::::
#        ::::``:::::::::'    .:::.
#        ::::'  ':::::'    .::::::::.
#       .::::'   ::::   .:::::::'::::.
#      .:::'    ::::: .:::::::::' ':::::.
#      .::'    :::::.:::::::::'   ':::::.
#     .::'     ::::::::::::::'     ``::::.
#   ...:::      ::::::::::::'       ``::.
#   ```` ':.     ':::::::::'         ::::..
#            '.:::::'          ':'````..
#           美女保佑 永無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的數據集,后面加上torch.rand()函數制造噪音
 
# 畫圖
# 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()

感謝你能夠認真閱讀完這篇文章,希望小編分享的“PyTorch如何搭建一維線性回歸模型”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

虹口区| 监利县| 平定县| 大庆市| 四平市| 武乡县| 巴彦淖尔市| 绥德县| 文昌市| 仙居县| 岚皋县| 郎溪县| 华坪县| 东乡县| 林周县| 林西县| 鄱阳县| 岚皋县| 高台县| 黑龙江省| 曲水县| 吐鲁番市| 延寿县| 盱眙县| 遂溪县| 廉江市| 永福县| 广饶县| 庄河市| 普兰店市| 金山区| 鄂托克旗| 微博| 伊宁县| 江口县| 横峰县| 永嘉县| 梓潼县| 宁都县| 英吉沙县| 荥经县|