%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...