001.从0开始实现线性回归(pytorch)

000动手从0实现线性回归

0. 背景介绍

我们构造一个简单的人工训练数据集,它可以使我们能够直观比较学到的参数和真实的模型参数的区别。

设训练数据集样本数为1000,输入个数(特征数)为2。给定随机生成的批量样本特征 X∈R1000×2

X∈R 1000×2 ,我们使用线性回归模型真实权重 w=[2,−3.4]⊤ 和偏差 b=4.2以及一个随机噪声项 ϵϵ 来生成标签

python 复制代码
# 需要导入的包
import numpy as np
import torch
import random
from d2l import torch as d2l
from IPython import display
from matplotlib import pyplot as plt

1. 生成数据集合(待拟合)

使用python生成待拟合的数据

python 复制代码
num_input = 2
num_example = 1000
w_true = [2,-3.4]
b_true = 4.2
features = torch.randn(num_example,num_input)
print('features.shape = '+ str(features.shape) )
labels =  w_true[0] * features[:,0] + w_true[1] * features[:,1] + b_true
labels += torch.tensor(np.random.normal(0,0.01 , size = labels.size() ),dtype = torch.float32)
print(features[0],labels[0])

2.数据的分批量处理

python 复制代码
def data_iter(batch_size, features, labels):
    num_example = len(labels)
    indices = list(range(num_example))
    random.shuffle(indices)
    for i in range(0, num_example, batch_size):
        j = torch.tensor( indices[i:min(i+ batch_size,num_example)])
        yield features.index_select(0,j) ,labels.index_select(0,j)

3. 模型构建及训练

3.1 定义模型:

python 复制代码
def linreg(X, w, b):
    return torch.mm(X,w)+b

3.2 定义损失函数

python 复制代码
def square_loss(y, y_hat):
    return (y_hat - y.view(y_hat.size()))**2/2

3.3 定义优化算法

python 复制代码
def sgd(params , lr ,batch_size):
    for param in params:
        param.data  -= lr * param.grad / batch_size

3.4 模型训练

python 复制代码
# 设置超参数
lr = 0.03
num_epochs =5
net = linreg
loss = square_loss
batch_size = 10
for epoch in range(num_epochs):
    for X,y in data_iter(batch_size= batch_size,features=features,labels= labels):
        l = loss(net(X,w,b),y).sum()
        l.backward()
        sgd([w,b],lr,batch_size=batch_size)
        #梯度清零避免梯度累加
        w.grad.data.zero_()
        b.grad.data.zero_()
    train_l = loss(net(features,w,b),labels)
    print('epoch %d, loss %f' %(epoch +1 ,train_l.mean().item()))

epoch 1, loss 0.032550

epoch 2, loss 0.000133

epoch 3, loss 0.000053

epoch 4, loss 0.000053

epoch 5, loss 0.000053


基于pytorch的线性模型的实现

  1. 相关数据和初始化与上面构建相同
  2. 定义模型
python 复制代码
import torch
from torch import nn
class LinearNet(nn.Module):
    def __init__(self, n_feature):
        # 调用父类的初始化
        super(LinearNet,self).__init__()
        # Linear(输入特征数,输出特征的数量,是否含有偏置项)
        self.linera = nn.Linear(n_feature,1)

    def forward(self,x):
        y = self.linera(x)
        return y
#打印模型的结构:
net = LinearNet(num_input)
print(net) 
# LinearNet( (linera): Linear(in_features=2, out_features=1, bias=True)
)
  1. 初始化模型的参数
python 复制代码
from torch.nn import init
init.normal_(net.linera.weight,mean=0,std= 0.1)
init.constant_(net.linera.bias ,val=0)
  1. 定义损失函数

    loss = nn.MSELoss()

5.定义优化算法

python 复制代码
import torch.optim as optim
optimizer =  optim.SGD(net.parameters(),lr = 0.03)
print(optimizer)
  1. 训练模型:
python 复制代码
num_epochs = 3
for epoch in range(1,num_epochs+1):
    for X,y in data_iter(batch_size= batch_size,features=features,labels= labels):
        output= net(X)
        l = loss(output,y.view(-1,1))
        optimizer.zero_grad()
        l.backward()
        optimizer.step()
    print('epoch %d ,loss: %f' %(epoch,l.item()) )

epoch 1 ,loss: 0.000159

epoch 2 ,loss: 0.000089

epoch 3 ,loss: 0.000066

相关推荐
爱打球的白师傅24 分钟前
python机器学习工程化demo(包含训练模型,预测数据,模型列表,模型详情,删除模型)支持线性回归、逻辑回归、决策树、SVC、随机森林等模型
人工智能·python·深度学习·机器学习·flask·逻辑回归·线性回归
MediaTea1 小时前
Python 第三方库:TensorFlow(深度学习框架)
开发语言·人工智能·python·深度学习·tensorflow
极客代码1 小时前
第七篇:深度学习SLAM——端到端的革命--从深度特征到神经辐射场的建图新范式
人工智能·python·深度学习·计算机视觉·slam·回环检测·地图构建
有Li2 小时前
面向超声半监督分割的类别特异性无标记数据风险最小化|文献速递-文献分享
人工智能·深度学习·计算机视觉
WGS.2 小时前
CMake Error at fc_base/gflags-src/CMakeLists.txt:73
深度学习
南汐汐月4 小时前
重生归来,我要成功 Python 高手--day35 深度学习 Pytorch
pytorch·python·深度学习
齐齐大魔王4 小时前
深度学习系列(二)
人工智能·深度学习
xier_ran4 小时前
深度学习:学习率衰减(Learning Rate Decay)
人工智能·深度学习·机器学习
Francek Chen4 小时前
【CANN】开启AI开发新纪元,释放极致计算效率
人工智能·深度学习·cann·ai开发
CoovallyAIHub5 小时前
结构化数据迎来“ChatGPT时刻”!LimitX:一个模型统一所有表格任务
深度学习·算法·计算机视觉