首页 > 其他分享 >线性回归模型实现——pytorch版

线性回归模型实现——pytorch版

时间:2023-07-29 09:14:58浏览次数:44  
标签:labels features 模型 torch batch pytorch num 线性 size

import random
import torch
from d2l import torch as d2l

def synthetic_data(w,b,num_examples):
    """生成y=Xw+b+噪声"""
    x = torch.normal(0,1,(num_examples,len(w))) #0 1 正态分布,num_examples个样本,len(w)列
    print('len是:'+str(len(w)))
    # 生成y
    y = torch.matmul(x,w) + b
    # 加入正态分布0 0.01的和y相等列的噪音
    y += torch.normal(0,0.01,y.shape)
    # -1代表自动计算维度,1代表一列
    return x,y.reshape((-1,1))

true_w = torch.tensor([2,-3.4])
true_b = 4.2
features, labels = synthetic_data(true_w,true_b,1000)

print('features:',features[0],'\nlabel:',labels[0])

# d2l.set_figsize()
# 画第一列和labels
# d2l.plt.scatter(features[:,(1)].detach().numpy(),labels.detach().numpy(),1)

def data_iter(batch_size,features,labels):
    # 查看一共有多少个样本
    num_examples = len(features)
    #获取样本索引
    indices = list(range(num_examples))
    # 把样本索引打乱
    random.shuffle(indices)
    for i in range(0,num_examples,batch_size):
        batch_indices = torch.tensor(
            # 从头开始按索引取值,防止去过头加了验证条件
            indices[i:min(i+batch_size,num_examples)]
        )
        # 随机顺序的特征和标号
        yield features[batch_indices],labels[batch_indices],

batch_size = 10
for x,y in data_iter(batch_size,features,labels):
    # x是10x1的tensor,y是10x1的向量
    print(x,'\n',y)
    break

w = torch.normal(0,0.01,size=(2,1),requires_grad=True)
b = torch.zeros(1,requires_grad=True)

def linreg(x,w,b):
    """线性回归模型"""
    return torch.matmul(x,w)+b

def squared_loss(y_hat,y):
    """均方损失"""
    # 让预测值和真实值格式统一,做均方损失
    return (y_hat - y.reshape(y_hat.shape))**2/2

# 定义优化算法
def sgd(params,lr,batch_size):
    """小批量随机梯度下降"""
    with torch.no_grad():   #不更新梯度
        for param in params:
            # 对每个参数做梯度下降
            param -= lr*param.grad/batch_size
            # 梯度清零
            param.grad.zero_()

# 学习率
lr = 0.03
# 将模型扫3遍
num_epochs = 3
net = linreg
loss = squared_loss
for epoch in range(num_epochs):
    for x,y in data_iter(batch_size,features,labels):
        # x和y的小批量损失
        l = loss(net(x,w,b),y)
        # 因为l的形状是(batch_size,1),而不是一个标量
        # l中的所有元素被加到一起,并以此计算关于[w,b]的梯度
        l.sum().backward()
        # 使用参数的梯度更新参数
        sgd([w,b],lr,batch_size)
    with torch.no_grad():
        train_l = loss(net(features,w,b),labels)
        print(f'epoch{epoch+1},loss{float(train_l.mean()):f}')

print(f'w的估计误差:{true_w-w.reshape(true_w.shape)}')
print(f'b的估计误差:{true_b-b}')

运行结果

len是:2
features: tensor([-0.2004, -2.0049]) 
label: tensor([10.6152])
tensor([[ 1.0884, -0.9585],
        [-0.1686,  0.4229],
        [-0.3642, -0.7151],
        [ 1.2426, -1.3948],
        [ 0.7473, -0.0862],
        [ 0.6056, -1.4912],
        [ 0.8237,  1.2756],
        [-0.0991, -1.0443],
        [-1.0252,  0.6845],
        [ 0.1991, -0.4367]]) 
 tensor([[ 9.6328],
        [ 2.4175],
        [ 5.9022],
        [11.4402],
        [ 5.9788],
        [10.4812],
        [ 1.5190],
        [ 7.5556],
        [-0.1732],
        [ 6.0907]])
epoch1,loss0.032279
epoch2,loss0.000108
epoch3,loss0.000048
w的估计误差:tensor([-0.0004,  0.0002], grad_fn=<SubBackward0>)
b的估计误差:tensor([0.0003], grad_fn=<RsubBackward1>)

标签:labels,features,模型,torch,batch,pytorch,num,线性,size
From: https://www.cnblogs.com/jinbb/p/17589265.html

相关文章

  • 基于Timoshenko梁模型的Green函数的推导和应用
    武汉工程大学 土木工程与建筑学院      方芳    15927602711Timoshenko梁模型是一种广泛应用于结构动力学中的梁理论,它考虑了梁的横向变形和转动惯量的影响。在Timoshenko梁模型中,梁被假设为一个弹性体,其横向变形可以用一个线性弹性常数k表示。该模型的......
  • 苹果mac m1,m2芯片安装 pytorch和tensorflow的GPU版本
    一、下载M芯片的anaconda,并安装 二、安装GPU版本的pytorch1.安装Xcodexcode-select--install2.创建环境condacreate-ntorch-gpupython=3.11condaactivatetorch-gpu 3.打开pytorch官网复制命令,注意:在macm上,device是’mps’而不是’cuda’,mac的MPS......
  • 5 线性数据结构 参考代码
    P3156[深基15.例1]询问学号#include<cstdio>constintMAXN=2000005;inta[MAXN];intmain(){intn,m;scanf("%d%d",&n,&m);for(inti=0;i<n;++i)scanf("%d",&a[i]);while(m--){int......
  • PyTorch 1.4 中文文档校对活动正式启动 | ApacheCN
    一如既往,PyTorch1.4中文文档校对活动启动了!认领须知请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并不要求您做到十全十美,因此请不要担心因为翻译上犯错——在大部分情况下,我们的服务器已经记录所有的翻译,因此您不必担心会因为您的失误遭到无法挽回的破坏。(改编自维基百......
  • 揭秘爱数AnyShare认知助手:大模型深度产品化,深化人与机器的“分工协作”
    文|智能相对论作者|叶远风大模型竞逐日趋白热化,百模大战热闹非凡。但是,对产业主体或者普通看客而言,大模型究竟如何改变一线业务、实现工作方式的变革甚至组织转型,很多人并没有具象化的认知。技术厉害、产品牛,宏大的憧憬和规划下,大模型到底是怎么进入到行业一线实现落地的?最近,大......
  • 深度学习-->线性回归模型
    #线性回归#创建数据集frommxnetimportndarrayasndfrommxnetimportautogradasadnum_input=2num_examples=1000true_w=[2,-3.4]true_b=4.2x=nd.random_normal(shape=(num_examples,num_input))y=true_w[0]*x[:,0]+true_w[1]*x[:,1]......
  • 非线性规划【复习笔记】
    一、基本概念(一)、非线性规划数学模型非线性规划数学模型的一般形式是:\(\begin{cases}minf(\boldX)\\\quadh_i(\boldX)=0(i=1,2,\dots,m)\\\quadg_j(\boldX)\geq0(j=1,2,\dots,l)\end{cases}\)其中,\(X=(x_1,x_2,\dots,x_n)^T\)是\(n\)维欧氏空间\(E_n\)中的点......
  • PyTorch基础知识-新手笔记
    PyTorch是Facebook团队于2017年1月发布的一个深度学习框架。PyTorch采用Python语言接口来实现编程,就像带GPU的NumPy,与Python一样属于动态框架。PyTorch继承了Torch灵活、动态的编程环境和用户友好等特点,支持以快速与灵活的方式构建动态神经网络,还允许在训练过程中快速更改代码而不......
  • Transformer模型
    Transformer模型Transformer模型及其实现历史:谷歌团队在2017年提出的经典NLP模型(目前很火的bert模型就是基于此模型)。特点:Transformer模型使用了Self-Attention机制,不采用RNN的顺序结构,使得模型可以并行化训练,而且能够拥有全局信息所有的大语言模型都是基于transformer......
  • 图注意力网络论文详解和PyTorch实现
    图神经网络(gnn)是一类功能强大的神经网络,它对图结构数据进行操作。它们通过从节点的局部邻域聚合信息来学习节点表示(嵌入)。这个概念在图表示学习文献中被称为“消息传递”。消息(嵌入)通过多个GNN层在图中的节点之间传递。每个节点聚合来自其邻居的消息以更新其表示。这个过......