pytorch實現最簡單的線性回歸

2021-09-11 07:50:04 字數 3077 閱讀 9832

import torch

import time

from torch.autograd import variable

import torch.nn.functional as f

x = torch.unsqueeze(torch.linspace(-2, 2, 10), dim=1)

y = x.pow(2) + 0.2 * torch.rand(x.size())

#math.pow(100, 2) : 10000.0

#t.unsqueeze(di) //在di個維度處公升維

#t=t.rand(t.size()) //均勻分布

#t=t.randn(t.size()) //標準正態分佈

#torch.randn(*sizes, out=none)

#返回乙個張量,包含了從標準正態分佈(mean=0, std=1)中抽取一組隨機數,形狀 #由可變引數sizes定義。

#t=t.linspace(m,n,step_num) //[m,n]中以m為首項,n為末項,均分區間為step_num段

x, y = variable(x), variable(y)

#variable就是 變數 的意思。實質上也就是可以變化的量,區別於int變數,它是一種可以變化的變數,這正好就符合了反向傳播,引數更新的屬性

#把雞蛋放到籃子裡, requires_grad是參不參與誤差反向傳播, 要不要計算梯度

#tensor不能反向傳播,variable可以反向傳播。

class net(torch.nn.module):

def __init__(self, n_features, n_hidden, n_output):

super(net, self).__init__()

self.hidden = torch.nn.linear(n_features, n_hidden)

self.predict = torch.nn.linear(n_hidden, n_output)

def forward(self, x):

x = f.relu(self.hidden(x))

x = self.predict(x)

return x

model=net(1,1,1)

optimizer = torch.optim.sgd(model.parameters(), lr=0.3)

loss_func = torch.nn.mseloss()

for t in range(10):

prediction = model(x)

loss = loss_func(prediction,y)

print(loss)

optimizer.zero_grad()

loss.backward()

optimizer.step()

一般神經網路的類都繼承自torch.nn.module,init()和forward()兩個函式是自定義類的主要函式。在__init__()中都要新增一句super(net, self).init(),這是固定的標準寫法,用於繼承父類的初始化函式。init()中只是對神經網路的模組進行了宣告,真正的搭建是在forwad()中實現。自定義類中的成員都通過self指標來進行訪問,所以引數列表中都包含了self。

訓練網路之前我們需要先定義優化器和損失函式。torch.optim包中包括了各種優化器,這裡我們選用最常見的sgd作為優化器。因為我們要對網路的引數進行優化,所以我們要把網路的引數net.parameters()傳入優化器中,並設定學習率(一般小於1)。

由於這裡是回歸任務,我們選擇torch.nn.mseloss()作為損失函式。

由於優化器是基於梯度來優化引數的,並且梯度會儲存在其中。所以在每次優化前要通過optimizer.zero_grad()把梯度置零,然後再後向傳播及更新。

torch.nn.module

定義自已的網路:

需要繼承nn.module類,並實現forward方法。

一般把網路中具有可學習引數的層放在建構函式__init__()中,

不具有可學習引數的層(如relu)可放在建構函式中,也可不放在建構函式中(而在forward中使用nn.functional來代替)

只要在nn.module的子類中定義了forward函式,backward函式就會被自動實現(利用autograd)。

在forward函式中可以使用任何variable支援的函式,畢竟在整個pytorch構建的圖中,是variable在流動。還可以使用if,for,print,log等python語法.

pytorch中torch.view()的用法:

把原先tensor中的資料按照行優先的順序排成乙個一維的資料(這裡應該是因為要求位址是連續儲存的),然後按照引數組合成其他維度的tensor。比如說是不管你原先的資料是[[[1,2,3],[4,5,6]]]還是[1,2,3,4,5,6],因為它們排成一維向量都是6個元素,所以只要view後面的引數一致,得到的結果都是一樣的。比如,

a=torch.tensor([[[1,2,3],[4,5,6]]])

b=torch.tensor([1,2,3,4,5,6])

print(a.view(1,6))

print(b.view(1,6))

得到的結果都是tensor([[1., 2., 3., 4., 5., 6.]])

torch.view(a,b)

將乙個多維度的矩陣拼接成a×b

torch.squeeze()

用於將矩陣進行壓縮,

有0和1兩種引數分別表示第一維度和第二維度,torch.sequeeze(0)表示若第一維度的值為1,則去掉。第二維度同理。

若引數為矩陣,即torch.squeeze(a)則表示去掉a矩陣維數為1的維度。

torch.unsqueeze()

用於矩陣維度的擴充,

torch.unsqueeze(a, n)對矩陣a在指定維度n加上一維。

Pytorch 通過pytorch實現線性回歸

linear regression 線性回歸是分析乙個變數與另外乙個 多個 變數之間關係的方法 因變數 y 自變數 x 關係 線性 y wx b 分析 求解w,b 求解步驟 1.確定模型 2.選擇損失函式 3.求解梯度並更新w,b 此題 1.model y wx b 下為 實現 import tor...

利用Pytorch實現簡單的線性回歸演算法

最近聽了張江老師的深度學習課程,用pytorch實現神經網路 之前做titanic生存率 的時候稍微了解過tensorflow,聽說tensorflow能做的pyorch都可以做,而且更方便快捷,自己嘗試了一下 的邏輯確實比較簡單。pytorch涉及的基本資料型別是tensor 張量 和autogr...

Pytorch實現線性回歸 手動

pytorch實現線性回歸 假設我們的基礎模型就是 y wx b 其中w和b均為引數,我們使用y 3 x 0.8來構造資料x,y 所以最後通過模型應該能夠得到w和b應該在3與0.8附近。思路如下 1準備資料 2計算 值 3計算損失,把引數的梯度設定為0,進行反向傳播 4更新引數 5效果視覺化 1準備...