動手學深度學習 線性回歸簡潔實現

2021-10-02 22:39:10 字數 4781 閱讀 2760

%matplotlib inline

import torch

from ipython import display

from matplotlib import pyplot as plt

import numpy as np

import random

num_inputs =

2num_examples =

1000

true_w =[2

,-3.4]

true_b =

4.2features = torch.tensor(np.random.normal(0,

1,(num_examples, num_inputs)

), dtype=torch.

float

)labels = true_w[0]

* features[:,

0]+ true_w[1]

* features[:,

1]+ true_b

labels += torch.tensor(np.random.normal(0,

0.01

, size=labels.size())

, dtype=torch.

float

)引入包data

import torch.utils.data as data

#我們將隨機讀取包含10個資料樣本的小批量。

batch_size=

10#將訓練資料的特徵和標籤組合

dataset=data.tensordataset(features,labels)

#隨機讀取小批量

data_iter=data.dataloader(dataset,batch_size,shuffle=

true

)x為特徵,y為標籤

for x, y in data_iter:

print

(x, y)

break

顯示十組樣本

tensor([[-1.8260e-02, -1.8539e+00],

[ 2.7153e+00, -8.0274e-01],

[ 1.1816e+00, -1.6339e+00],

[ 6.7064e-01, 5.4746e-02],

[-2.3032e-03, -3.0165e-01],

[-1.4742e+00, -7.6091e-01],

[-8.5933e-02, -8.7749e-01],

[-1.1166e+00, -2.9864e-01],

[-1.1381e+00, -1.7337e+00],

[ 5.2272e-01, 3.4782e-01]]) tensor([10.4590, 12.3635, 12.1245, 5.3490, 5.2047, 3.8285, 7.0125, 3.0020,

7.8430, 4.0502])

#定義模型

#nn包就是利用autograd來定義模型

#nn的核心資料結構是module,既可以表示神經網路中的某個層(layer),也可以表示乙個包含很多層的神經網路。

#在實際使用中,最常見的做法是繼承nn.module,撰寫自己的網路/層。乙個nn.module例項應該包含一些層以及返回輸出的前向傳播(forward)方法

###########

super()函式用法

super可以代指父類。

可以使用super關鍵字呼叫init方法,

語法格式:super(子類,self).init(引數1,引數2,…)

效果等同於:父類名稱.init(self,引數1,引數2,…)

此時呼叫父類,是為了使用nn的方法

#linear()方法

a=nn.linear(in,out)相當於定義了乙個叫a的網路結構:y=x*w+b,w的size是(out,in),b的size是(out)

#in_features:前一層網路神經元的個數輸入為x1,x2兩個特徵

#out_features: 該網路層神經元的個數,輸出為y

作為乙個單層神經網路,線性回歸輸出層中的神經元和輸入層中各個輸入完全連線。因此,線性回歸的輸出層又叫全連線層。

class

linearnet

(torch.nn.module)

:def

__init__

(self,n_feature)

: self.linear=nn.linear(n_feature,1)

#前向傳播

defforward

(self,x)

: y=self.linear(x)

return y

net=linearnet(num_inputs)

#######寫法二

# net = nn.sequential(

# nn.linear(num_inputs, 1)

# # 此處還可以傳入其他層

# )

########寫法三

# sequential()函式,是個容器,把網路新增進去

# net = nn.sequential()

# net.add_module('linear', nn.linear(num_inputs, 1))

print

(net)

#列印網路結構

nn.module子類物件呼叫陪你過module建構函式的方法net.parameters():

檢視權重w及偏差b

#檢視可學習引數,函式返回乙個生成器

for param in net.parameters():

print

(param)

init模組初始化模型引數:

net.linear.weight,通過子類屬性呼叫w,b

init.constant_:用val值填充輸入張量或變數。

init.normal_:用正態分佈n(均值,std)n(均值,std)來填充輸入張量或變數。

#初始化模型引數

from torch.nn import init

init.normal_(net.linear.weight,mean=

0,std=

0.01

)#w正態分佈

init.constant_(net.linear.bias,val=0)

#b偏差為零

#定義損失函式

loss = nn.mseloss(

)#nn.module子類,mseloss以均方誤差損失作為模型的損失函式

sgd梯度下降

optim模組, nn.module方法.parameters(),修改超引數

#定義優化函式

import torch.optim as optim

#指定學習率為0.03的小批量隨機梯度下降(sgd)為優化演算法

#sgd是個字典

optimizer = optim.sgd(net.parameters(

), lr=

0.03

)print

(optimizer)

#修改學習率

for param_group in optimizer.param_groups:

param_group[

'lr']*=

5# 學習率為之前的0.1倍

sgd (

parameter group 0

dampening: 0

lr: 0.03

momentum: 0

nesterov: false

weight_decay: 0

)##############

#訓練模型

#為什麼loss.backward()要放在optimizer.step()前面

#loss.backward()是對w,b求導

#在計算模型中所有張量的梯度(loss.backward())後,呼叫optimizer.step()會使優化器迭代它應該更新的所有引數(張量),

#並使用它們內部儲存的grad來更新它們的值.

#順序不可顛倒,沒求梯度談何更新

#注意每次迭代梯度更新

num_epochs =

3for epoch in

range(1

, num_epochs +1)

:#x為特徵,y為label

for x, y in data_iter:

#net相當於神經網路,就是線性回歸的模型

optimizer.zero_grad(

) output = net(x)

l = loss(output, y.view(-1

,1))

# 梯度清零,等價於net.zero_grad(),grad是累加的,每次迭代並不需要梯度累計

l.backward(

)#小批量的損失對模型引數求梯度,對w,b求導

#更新所有引數,更新模型[w,b]

optimizer.step(

)#pytorch中的.item()用於將乙個零維張量轉換成浮點數

print

('epoch %d, loss: %f'

%(epoch, l.item())

)

動手學深度學習筆記 線性回歸

主要內容包括 線性回歸的基本要素 線性回歸模型從零開始的實現 線性回歸模型使用pytorch的簡潔實現 為了簡單起見,這裡我們假設 只取決於房屋狀況的兩個因素,即面積 平方公尺 和房齡 年 接下來我們希望探索 與這兩個因素的具體關係。線性回歸假設輸出與各個輸入之間是線性關係 主要內容包括 線性回歸的...

動手學深度學習

線性回歸的基本要素 模型 為了簡單起見,這裡我們假設 只取決於房屋狀況的兩個因素,即面積 平方公尺 和房齡 年 接下來我們希望探索 與這兩個因素的具體關係。線性回歸假設輸出與各個輸入之間是線性關係 price warea area wage age b price warea area wage a...

動手學深度學習(一)

其中 w1 和 w2 是權重 weight b 是偏差 bias 且均為標量。訓練資料 損失函式 通常,我們用訓練資料集中所有樣本誤差的平均來衡量模型 的質量 w 1,w 2,b 為使訓練樣本平均損失最小的解 優化演算法 b 代表每個小批量中的樣本個數 批量大小,batch size 稱作學習率 l...