Pytorch 线性回归(下)【Pytorch 基础第四话】

Pytorch实现线性回归模型 我们接下来使用Pytorch的API来手动构建一个线性回归的假设函数损失函数及优化方法,熟悉一下训练模型的流程。🧨我们将这批数据每次分成16份训练,并且这样重复训练epochs次,可以更深入地学习数据中的特征和模式,有助于防止模型快速陷入局部最优解,从而提高模型的泛化能力,而且。由于每个批次的数据都是随机抽取的。方法被调用时,PyTorch 会自动计算该张量相对于所有需要梯度的参数的梯度,并将这些梯度累加到对应参数的。是简单函数还是复杂的损失函数,都能利用相同的方法来进行梯度的反向传播。 阅读详情

数据归一化

假如我们不对数据进行归一化,数据会在损失曲线下降到一般的时候就不再快速下降了。因为再快速下降的时候,是因为某个特征带来的红利,但一旦红利耗尽之后,再次迭代就不再那么明显了,会十分缓慢。
如图:
Normalization
对数据进行归一化之后再进行线性回归:
归一化手段,示例使用均值归一化,公式如下:
X:=X−avg(X)rangeX:=\frac{X-avg(X)}{range}X:=rangeX−avg(X)​
这样可以把X控制在 −0.5<X<0.5-0.5<X<0.5−0.5<X<0.5

import torch
from debug import ptf_tensor

x = torch.tensor([[1, 1, 1], [2, 3, 1], [3, 5, 1],
        [4, 2, 1], [5, 4, 1]], dtype=torch.float32)
y = torch.tensor([-10, 12, 14, 16, 18],
        dtype=torch.float32)

x_mean, x_std = torch.mean(x, dim=0), torch.std(x, dim=0)
x_mean[-1], x_std[-1] = 0, 1 #因为所有组的x的最后一个元素都是1,为了避免出现nan
x_norm = (x - x_mean) / x_std

ptf_tensor(x_mean,'mean')
ptf_tensor(x_std,'std')
ptf_tensor(x_norm,'norm')

输出:

The info of mean:
#############################
  @dims: 1
  @size: torch.Size([3])
  @ele_sum: 3
  @dtype: torch.float32
  @data:
tensor([3., 3., 0.])
#############################


The info of std:
#############################
  @dims: 1
  @size: torch.Size([3])
  @ele_sum: 3
  @dtype: torch.float32
  @data:
tensor([1.5811, 1.5811, 1.0000])
#############################


The info of norm:
#############################
  @dims: 2
  @size: torch.Size([5, 3])
  @ele_sum: 15
  @dtype: torch.float32
  @data:
tensor([[-1.2649, -1.2649,  1.0000],
        [-0.6325,  0.0000,  1.0000],
        [ 0.0000,  1.2649,  1.0000],
        [ 0.6325, -0.6325,  1.0000],
        [ 1.2649,  0.6325,  1.0000]])
#############################

我们对之前的线性回归进行归一化,可以缩小迭代次数。之前我们都是用30001次,现在我们只需要10001次。

import torch
import torch.nn
import torch.optim

x = torch.tensor([[1000000, 0.0001], [2000000, 0.0003],
        [3000000, 0.0005], [4000000, 0.0002], [5000000, 0.0004]])
y = torch.tensor([-1000., 1200., 1400., 1600., 1800.]).reshape(-1, 1)

x_mean, x_std = torch.mean(x,dim=0), torch.std(x,dim=0)
x_norm = (x-x_mean)/x_std

y_mean, y_std = torch.mean(y,dim=0), torch.std(y,dim=0)
y_norm=(y-y_mean)/y_std

fc=torch.nn.Linear(2,1)
criterion=torch.nn.MSELoss()
optimizer=torch.optim.Adam(fc.parameters())


for step in range(10001):
    if step:
        optimizer.zero_grad()
        loss_norm.backward()
        optimizer.step()
    
    pred_norm=fc(x_norm)
    loss_norm=criterion(pred_norm,y_norm)
    pred=pred_norm * y_std + y_mean
    loss = criterion (pred,y)
    if step % 1000 ==0:
        print('step = {}, loss = {:g}'.format(step, loss))

输出:

step = 0, loss = 2.25879e+06
step = 1000, loss = 292322
step = 2000, loss = 216877
step = 3000, loss = 213382
step = 4000, loss = 213333
step = 5000, loss = 213333
step = 6000, loss = 213333
step = 7000, loss = 213333
step = 8000, loss = 213333
step = 9000, loss = 213333
step = 10000, loss = 213333

Demo: 世界人口数据线性回归实验

(1)从CSV文件获取数据

url='C:/Users/HUAWEI/Desktop/深度学习/Blog附带代码/population.csv'
df = pd.read_csv(url, index_col=0)
#print(df) #数据预览

years=torch.tensor(df.iloc[:,0],dtype=torch.float32) # 取出第0列数据作为Years
populations=torch.tensor(df.iloc[:,1],dtype=torch.float32) #取出第1列数据作为人口数据

(2)Reshape


x=years.reshape(-1,1) # reshpae(-1,1)等价于reshape(n,1),因为大多时候我们都不知道所有元素的总数
ptf_tensor(x,'years reshape',)
y=populations
'''
这是我们需要的数据形式:
    X=[ [,,] , [,,] , [,,] ] # X=m*n m是样本数量,n是特征数
    y=[,,,] # Y=m*1
    W=[,,] # W=n*1
Y=XW
'''

(3)归一化

def get_mean_std_norm(x):
    x_mean,x_std=torch.mean(x),torch.std(x)
    x_norm=(x-x_mean)/x_std
    return x_mean,x_std,x_norm

x_mean,x_std,x_norm=get_mean_std_norm(x)
y_mean,y_std,y_norm=get_mean_std_norm(y)

(4)建造四大组件:线性容器,标准容器,梯度容器,权值浏览器

Linear,criterion,optimizer,weights和bias
分别用于:

  • 计算函数
  • 计算当前Loss
  • 更新梯度
  • 浏览计算过程中的中间结果
fc=torch.nn.Linear(1,1) #Y=XW式子中y的数量和x的数量
criterion=torch.nn.MSELoss()
optimizer=torch.optim.Adam(fc.parameters())

weights_norm,bias_norm=fc.parameters() #每次结果生成器

(5)迭代


for step in range(20001):
    if step:
        optimizer.zero_grad()
        loss_norm.backward()
        optimizer.step()
    
    output_norm=fc(x_norm)
    pred_norm=output_norm.squeeze()
    loss_norm=criterion(pred_norm,y_norm) # 统一size才能计算loss

    weights=y_std/x_std *weights_norm
    bias=(weights_norm*(0-x_mean)/x_std+bias_norm)*y_std+y_mean
    if step % 5000==0:
        print('step={}, weights={}, loss={}'.format(step,weights.item(),loss_norm))

(6)绘图


plt.scatter(years, populations, s=0.1, label='actual', color='k')
plt.plot(years.tolist(), (years*weights + bias).squeeze(dim=0).tolist(), label='result', color='k') 
#注意:这里years.size=[67],result.size=[1,67],所以要对result进行squeeze

plt.xlabel('Year')
plt.ylabel('Population')
plt.legend()
plt.show()
Demo 完整代码:
import pandas as pd
import matplotlib.pyplot as plt

import torch
import torch.nn
import torch.optim

from debug import ptf_tensor

url='C:/Users/HUAWEI/Desktop/深度学习/Blog附带代码/population.csv'
df = pd.read_csv(url, index_col=0)
#print(df) #数据预览

years=torch.tensor(df.iloc[:,0],dtype=torch.float32) # 取出第0列数据作为Years
populations=torch.tensor(df.iloc[:,1],dtype=torch.float32) #取出第1列数据作为人口数据

ptf_tensor(years,'years',data_only=True) #预览数据
ptf_tensor(populations,'populations',data_only=True) #预览数据

x=years.reshape(-1,1) # reshpae(-1,1)等价于reshape(n,1),因为大多时候我们都不知道所有元素的总数
ptf_tensor(x,'years reshape',)
y=populations
'''
这是我们需要的数据形式:
    X=[ [,,] , [,,] , [,,] ] # X=m*n m是样本数量,n是特征数
    y=[,,,] # Y=m*1
    W=[,,] # W=n*1
Y=XW
'''
def get_mean_std_norm(x):
    x_mean,x_std=torch.mean(x),torch.std(x)
    x_norm=(x-x_mean)/x_std
    return x_mean,x_std,x_norm

x_mean,x_std,x_norm=get_mean_std_norm(x)
y_mean,y_std,y_norm=get_mean_std_norm(y)

fc=torch.nn.Linear(1,1) #Y=XW式子中y的数量和x的数量
criterion=torch.nn.MSELoss()
optimizer=torch.optim.Adam(fc.parameters())

weights_norm,bias_norm=fc.parameters() #每次结果生成器

for step in range(20001):
    if step:
        optimizer.zero_grad()
        loss_norm.backward()
        optimizer.step()
    
    output_norm=fc(x_norm)
    pred_norm=output_norm.squeeze()
    loss_norm=criterion(pred_norm,y_norm) # 统一size才能计算loss

    weights=y_std/x_std *weights_norm
    bias=(weights_norm*(0-x_mean)/x_std+bias_norm)*y_std+y_mean
    if step % 5000==0:
        print('step={}, weights={}, loss={}'.format(step,weights.item(),loss_norm))


plt.scatter(years, populations, s=0.1, label='actual', color='k')
plt.plot(years.tolist(), (years*weights + bias).squeeze(dim=0).tolist(), label='result', color='k') 
#注意:这里years.size=[67],result.size=[1,67],所以要对result进行squeeze

plt.xlabel('Year')
plt.ylabel('Population')
plt.legend()
plt.show()

输出:


step=0, weights=-3741121.0, loss=1.0858874320983887
step=5000, weights=75291096.0, loss=0.0031296168453991413
step=10000, weights=75291232.0, loss=0.0031296154484152794
step=15000, weights=75291248.0, loss=0.0031296159140765667
step=20000, weights=75291248.0, loss=0.0031296173110604286

在这里插入图片描述

详解使用pytorch实现线性回归 引言 pytorch作为一门主流的深度学习框架,API是非常多的,但使用pytorch搭建神经网络模型时,往往套路又较为固定。因此通过一些实际的例子去熟悉如何搭建模型,如何训练、测试数据,在实践中学习的效果往往要比漫无目的的学语法和API要好的多。 本文主要从最为基础的线性回归着手,严格来说线性回归更多的在机器学习中讨论,但是我们也能搭建一个简单的“神经网络”,用深度学习的套路来解决这个问题,而这个基本套路,即使是在搭建极为复杂的神经网络中也是适用的。 ... 阅读详情

相关推荐

PyTorch实现线性回归的基础写法与封装API写法

PyTorch实现线性回归的基础写法与封装API写法

Hiweir的博客 984

线性回归详细推导(含归一化必要性讨论)

(作者:陈玓玏) 假设有一组数据X,包含m个样本,其中每一个样本有n个特征值,每一个样本还对应其label y_i,也就是说这组数据是一个m*n的矩阵,那么我们可以通过一组参数theta来实现对label的预测,这样当新来一个样本时,我们可以通过找到的这一组参数theata(实际是一个函数)来预测其y值。 那怎么评估我们的预测是否准确呢? 先来科普一个三个概念:   损失函数(Loss Funct...

小白白的博客 1万+

Python和PyTorch深入实现线性回归模型:一篇文章全面掌握基础机器学习技术

Python 是一种强大的编程语言,特别适合处理和分析大数据,广泛应用于各种科学计算中。Python有很多库可以方便地实现各种高级功能,例如:NumPy, Pandas, Matplotlib等。PyTorch 是一个开源的 Python 机器学习库,基于 Torch。它主要由 Facebook 的 AI 研究团队开发,用于实现深度学习算法。PyTorch 以张量为基本数据结构,可以在GPU或CPU上进行计算。具有动态定义计算图的特性,使得 PyTorch 在编写和调试模型方面更具优势。

2401_85325519的博客 1321

八.用sklearn实现线性回归、标准化和归一化

八.用sklearn实现线性回归、标准化和归一化1.数据集简介2.使用sklearn的线性回归模型进行预测 1.数据集简介 波士顿房价数据集包含了506处波士顿不同地理位置的房产的房价数据(因变量),和与之对应的包含房屋以及房屋周围的详细信息(自变量),其中包含城镇犯罪率、一氧化氮浓度、住宅平均房间数、到中心区域的加权距离以及自住房平均房价等13个维度的数据,因此,波士顿房价数据集能够应用到回归问题上。 2.使用sklearn的线性回归模型进行预测 ...

weixin_36128607的博客 2318

线性回归 Pytorch

通常情况下,我们使用均方误差(Mean Squared Error, MSE)作为损失函数,用于衡量模型预测值与真实值之间的差异。线性回归是一种用于建立自变量(输入)和因变量(输出)之间线性关系的方法。在多维线性回归中,我们考虑多个自变量与一个因变量之间的线性关系。,使得损失函数最小化。我们通过梯度下降等优化算法来实现这一目标。具体地,我们反复迭代更新权重和偏置项,直到损失函数收敛到最小值。模型训练的目标是找到最优的权重。

言午日月 1148

Pytorch基础实战-通过简单的线性回归了解pytorch

Pytorch基础实战-通过简单的线性回归了解pytorch

qichen1997的博客 522

线性回归与特征归一化(feature scaling)

线性回归是一种回归分析技术,回归分析本质上就是一个函数估计的问题(函数估计包括参数估计和非参数估计),就是找出因变量和自变量之间的因果关系。回归分析的因变量是应该是连续变量,若因变量为离散变量,则问题转化为分类问题,回归分析是一个有监督学习问题。 线性其实就是一系列一次特征的线性组合,在二维空间中是一条直线,在三维空间中是一个平面,然后推广到n维空间,可以理解维广义线性吧。 例如对房屋的价格预

magicchu的博客 1万+

归因分析计算因子贡献度常见的方法

在归因分析中,我们一般都需要计算出每个因子的贡献度是多少,比如产品DAU上升,对年龄段维度进行拆解,看是不同年龄段的用户对DAU上升的贡献度是多少,一般根据指标的类型,计算贡献度的方法也不一样,下面就列出一些常见的归因分析贡献度的计算方法。

Hubans的博客 4万+

05.线性回归介绍

【数学基础】 什么是线性回归? 线性:两个变量之间的关系是一次函数(图像是直线); 非线性:两个变量之间的关系是非一次函数(图像不是直线); 回归:人们在测量事物的时候因为客观条件的限制,求的都是测量值,而不是事物的真实值,为了能够得到真实值无限次测量,最后通过这些测量数据计算回归到真实值,这就是回归的由来; 一般表达式:y=wx+by=wx+by=wx+b 均方误差(MSE):欧氏距离(损失函数) J=12m∑i=1m(y′−y)2J=\frac{1}{2m}\displaystyle\sum_{i=1

LWY_Xing的博客 1145

长期换衣行人重识别(Long-Term Clothes-Changing Person Reid)数据集汇总

长期换衣行人重识别任务中目前常用的数据集总览目前换衣数据集的主要问题数据集换衣/总体情况集统计DeepChange(2021)LaST(2021)COCAS(2020)VC-Clothes(2020)LTCC(2020)PRCC(2019)Celebrities-reID(2019) 总览 在长期换衣行人重识别的任务当中,数据集的获取(尤其是对于学术环境下)是一个难点,主要的困难有以下几点: 采集大规模的数据集比较困难。 采集不同的衣服的数据集比较困难。 采集不同衣服不同角度的数据集比较困难。 目前也有

KingsMan666的博客 8378

Windows 10/11一键搞定HDF5文件查看:HDFView 3.4.1免配置安装指南(附中文路径避坑技巧)

本文详细介绍了HDFView 3.4.1在Windows 10/11上的免配置安装方法及中文路径优化技巧。作为HDF5文件查看的专业工具,HDFView 3.4.1简化了安装流程,提升了科研数据处理效率,特别适合遥感、气象等领域的研究人员使用。

qsc9012345的博客 1143

线性回归之归一化(normalization)

文章解析归一化与梯度下降的关系,指出特征量纲差异导致梯度更新失衡(如收敛速度矛盾),而归一化通过优化数据分布(如标准归一化使数据均值为0、标准差为1)提升训练效率与模型精度,并对比最大最小值归一化与标准归一化的机制及适用场景。

缘友一世的博客 2710

一文搞懂【Linux 搭建 Dread Hunger 服务器】附本体及Docker部署集群方案

看直播发现了五花八门的开服器和版本,一时兴起按官方文档进行了搭建尝试,所以我的版本基于官方Stream2024.01.10更新的版本,也就是停服时的玩法,应该可以根据mod和补丁魔改成更那些开服器一样的版本,本文不做谈论,注重服务器搭建,毕竟8个人不可能在一个局域网里乱象:首先,我看了大量教程视频,一类是开服器的推广,另一类自建的基本采用Windows搭建,我觉得最离谱的是大部分教程都会教你买一台远程Windows虚拟机???

LHmine的博客 3983

pytorch线性回归_使用PyTorch进行线性回归

pytorch线性回归Your first step towards deep learning 您迈向深度学习的第一步 In my previous posts we have gone through 在我以前的帖子中,我们已经看过 Deep Learning — Artificial Neural Network(ANN) 深度学习-人工神经网络(ANN) Tensors — Basic...

weixin_26752765的博客 4297

★教程1:matlab学习教程入门100例目录

★基础入门 1.为什么要学习MATLAB 2.MATLAB安装 持续更新....... ★MATLAB基础编程语言熟悉

FPGA/MATLAB学习教程/源码/项目合作开发 4万+

innovus:InstPad、CellPad 、module padding、clock cell halo

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?site_num指的是padding的大小以site宽度为单位。

m0_61544122的博客 2020

PyTorch实现线性回归--LinearRegression

pytorch入门,线性回归,博大家一笑

Bro3Rd的博客 763

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

深入详解DICOM医学影像定位线相关知识:理解定位线的概念、定位线的作用以及定位线显示和计算原理

编程技术探索者,分享C/C++、C#、Java、数据库等开发经验,聚焦实战技巧与AI兴趣,助力编程爱好者成长。 2051

Pytorch 线性回归(上)【Pytorch 基础第三话】

最小二乘法求解 什么是最小二乘法? 如何理解最小二乘法? 我们假设对如下线性关系进行求解: Y=WXY=WXY=WX 例如: 已知X和Y矩阵: X4∗2=[x00x01x10x11x20x21x30x31]X^{4*2}=\begin{bmatrix}x_{00}&x_{01}\\x_{10}&x_{11}\\x_{20}&x_{21}\\x_{30}&x_{31}...

晋图的非正常人类胡言乱语集合 1019

CANoe-vTESTstudio之Test Diagram编辑器

总之,CANoe-vTESTstudio的Test Diagram编辑器提供了一个直观且强大的工具,用于创建和管理测试用例。通过图形化的界面和丰富的功能,测试工程师可以更轻松地编写复杂的测试脚本,并有效地进行测试开发。在上面的示例中,我们创建了一个名为"MyTestCase"的测试用例,并定义了两个测试步骤"Step1"和"Step2"。在上面的示例中,我们在执行"Step1"之后使用条件语句来确定是否执行"Step2"。在每次迭代中,我们创建一个新的测试步骤,并根据迭代次数动态生成相应的日志和验证消息。

TcData的博客 248

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

线性回归——pytorch与paddle实现线性回归的详细过程

本文将深入探讨线性回归的理论基础,并通过PyTorch和PaddlePaddle两个深度学习框架来展示如何实现线性回归模型。我们将首先介绍线性代数、微积分以及自动微分的基本概念,这些数学工具是理解和实现线性回归的基础。接着,我们将详细讲解线性回归问题的本质,包括其数学模型和求解方法。最后,通过PyTorch和PaddlePaddle的代码示例,我们将展示如何设计、训练和评估一个线性回归模型,从而让读者能够直观地理解并掌握这两种框架在机器学习问题中的应用。

Love you Joyfully的博客 1099

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

pytorch线性回归_PyTorch中的线性回归

pytorch线性回归For all those amateur Machine Learning and Deep Learning enthusiasts out there, Linear Regression is just the right way to kick start your journey. If you are new to Machine Learning with s...

weixin_26752765的博客 563

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

pytorch实现线性回归_如何用pytorch实现线性回归

pytorch实现线性回归Probably, implementing linear regression with PyTorch is an overkill. This library was made for more complicated stuff like neural networks, complex deep learning architectures, etc. Neve...

weixin_26756255的博客 609

基于PyTorch框架的线性回归实现指南

在PyTorch中,模型是通过继承nn.Module类来定义的。在这个模型中,nn.Linear是一个线性变换层,它接受输入特征,应用权重和偏置,然后输出预测结果。和参数定义了输入和输出的维度。这个模型非常简单,但它包含了构建更复杂神经网络所需的基本元素。

ciweic的博客 993

PyTorch基础入门二:PyTorch搭建一维线性回归模型

PyTorch基础入门二:PyTorch搭建一维线性回归模型 1)一维线性回归模型的理论基础 给定数据集,线性回归希望能够优化出一个好的函数,使得能够和尽可能接近。 如何才能学习到参数和呢?很简单,只需要确定如何衡量与之间的差别,我们一般通过损失函数(Loss Funciton)来衡量:。取平方是因为距离有正有负,我们于是将它们变为全是正的。这就是著名的均方误差。我们要做的事情就是希望能够找...

Liam的个人博客 1万+
上一篇: Pytorch 线性回归(上)【Pytorch 基础第三话】
下一篇: Pytorch 疑案之:优化器和损失函数是如何关联起来的?
JintuZheng
博客等级 码龄11年 1483粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值