線性回歸實現
深度學習第一章:最簡單的線性回歸實現
1. 引言
AI領域的線性回歸和其他領域不太一樣,包括了名詞和實現方式,所以必須先認識重要名詞,再把所有步驟熟悉一邊,並建立在之前學習線性回歸的基礎上
2. 學習目的:
- 知道線性回歸是什麼
- 知道線性回歸在深度學習領域怎麼在python上實現
- 程式碼實現,運行結果
- 知道每行程式碼怎麼來的
- 了解與後面的聯繫
3. 線性回歸是什麼
略
4. python 實現步驟
- 數據部分
- 數據生成
- 數據處理(小批量提取,生成迭代器)
- 模型初始化
- 模型定義
- 模型初始化
- 損失函數定義
- 更新規則:
- 優化函數定義:SGD 梯度下降
- 訓練(包含求出損失,反向傳遞,梯度下降,梯度清零)
5. 程式碼部分+解讀:
import torch as tc
import numpy as np
from torch.utils import data
from LimuAi.Linear_regression import synthetic_data
from torch import nn
#處理數據:
'''
定義實際數據
'''
true_k=tc.tensor([2,-3.4])
true_b=4.2
feature,lable=synthetic_data(true_k,true_b,1000) #數據初始化
'''
定義讀取數據的方法
'''
def read_data(sample,batch_size,is_train=True):#python是一個縮進控制組塊的語言
dataset=data.TensorDataset(*sample) #將sample變成元組之後,經過TensorDataset變成dataset對象,方便傳入dataloader函數進行小批量的抽取(我猜的,還沒求證)
return data.DataLoader(dataset,batch_size,shuffle=is_train) #返回一個迭代器,小批量的返回樣本數據
batch_size=10
item=read_data((feature,lable),batch_size) #生成item作為下方訓練用的迭代器,進行小批量隨機梯度下降
print(next(iter(item))) # 使用next得出第一個小批次
'''
定義模型
'''
net = nn.Sequential(nn.Linear(2, 1)) #搭建一個單層神經網路,並且神經元使用的是線性結構,且有兩個輸入,一個輸出
'''
初始化模型參數
'''
net[0].weight.data.normal_(0, 0.01)#對net實力初始化模型即使用[0]來定位,weight/bias .data來初始化,
net[0].bias.data.fill_(0)
'''
定義損失函數
'''
loss = nn.MSELoss() #使用nn底下的包即可實現計算MSE
'''
定義優化演算法
'''
trainer = tc.optim.SGD(net.parameters(), lr=0.03)
#把優化演算法也定義成對象,通過torch的optim包的SGD來實例化,SGD實例化需要模型參數和學習率(也是梯度下降所必須的)
#參數通過net的parameter可直接輸入
'''
訓練
'''
num_epochs = 3 #把數據集遍歷三遍
for epoch in range(num_epochs): #迭代器必須是一個list/元組之類的
for X, y in item: #取出隨機小批次,用來梯度下降
l=loss(net(X),y)#比較計算出的yhat和真實的y的RMSE
trainer.zero_grad() #用來清除模型的累計梯度
l.backward() #反向傳遞,回調
trainer.step() #更新模型參數
l=loss(net(feature),lable)
print(f'epoch {epoch + 1}, loss {l:f}')