pytorch实现线性回归

1. 实现线性回归前的准备

线性回归输出是一个连续值,因此适用于回归问题。回归问题在实际中很常见,如预测房屋价格、气温、销售额等连续值的问题。
与回归问题不同,分类问题中模型的最终输出是一个离散值。我们所说的图像分类、垃圾邮件识别、疾病检测等输出为离散值的问题都属于分类问题的范畴。softmax回归则适用于分类问题。

定义两个1000维的向量

import torch
from time import timea = torch.ones(1000)
b = torch.ones(1000)

向量相加的一种方法是,将这两个向量按元素逐一做标量加法。如下:

start = time()
c = torch.zeros(1000)
for i in range(1000):c[i] = a[i] + b[i]
print(time() - start)

输出:

0.02039504051208496

向量相加的另一种方法是,将这两个向量直接做矢量加法。

start = time()
d = a + b
print(time() - start) # 0.0008330345153808594

结果很明显,后者比前者更省时。因此,我们应该尽可能采用矢量计算,以提升计算效率。

定义一个房价预测问题,实例化应用场景:


我们通常收集一系列的真实数据,例如多栋房屋的真实售出价格和它们对应的面积和房龄。我们希望在这个数据上面寻找模型参数来使模型的预测价格与真实价格的误差最小。在机器学习术语里,该数据集被称为训练数据集(training data set)或训练集(training set),一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)。特征用来表征样本的特点。

在模型训练中,我们需要衡量价格预测值与真实值之间的误差。通常我们会选取一个非负数作为误差,且数值越小表示误差越小。一个常用的选择是平方函数。它在评估索引为 i 的样本误差的表达式为:

误差越小表示预测价格与真实价格越相近,且当二者相等时误差为0
我们用训练数据集中所有样本误差的平均来衡量模型预测的质量:

2. 线性回归的pytorch实现

导入所需的包或模块,其中的matplotlib包可用于作图,且设置成嵌入显示。

%matplotlib inline
import torch
from IPython import display
from matplotlib import pyplot as plt # matplotlib包可用于作图,且设置成嵌入显示
import numpy as np
import random

生成一个数据集:

num_inputs = 2 #特征数量
num_examples = 1000 # 数据数量,即样本数量
true_w = [2, -3.4] # 线性回归模型真实权重
true_b = 4.2 # 偏差
features = torch.randn(num_examples, num_inputs,dtype=torch.float32)
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
# y=k*x+b
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()),dtype=torch.float32) # 噪声项,服从均值为0、标准差为0.01的正态分布。噪声代表了数据集中无意义的干扰

features的每一行是一个长度为2的向量,而labels的每一行是一个长度为1的向量(标量)

通过生成第二个特征features[:, 1]和标签 labels 的散点图,可以更直观地观察两者间的线性关系。

def use_svg_display():# 用矢量图显示display.set_matplotlib_formats('svg') # 设置图类型为svg图def set_figsize(figsize=(3.5, 2.5)):use_svg_display()# 设置图的尺寸plt.rcParams['figure.figsize'] = figsizeset_figsize()
plt.scatter(features[:, 1].numpy(), labels.numpy(), 1) # 注意这里将tensor转化为numpy


在训练模型的时候,我们需要遍历数据集并不断读取小批量数据样本。这里我们定义一个函数:它每次返回batch_size(批量大小)个随机样本的特征和标签。

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):j = torch.LongTensor(indices[i: min(i + batch_size, num_examples)]) # 最后一次可能不足一个batchyield  features.index_select(0, j), labels.index_select(0, j)

读取第一个小批量数据样本并打印。每个批量的特征形状为(10, 2),分别对应批量大小和输入个数;标签形状为批量大小。

batch_size = 10for X, y in data_iter(batch_size, features, labels):print(X, y)break # 读取一个batch

输出:

tensor([[-1.4239, -1.3788],[ 0.0275,  1.3550],[ 0.7616, -1.1384],[ 0.2967, -0.1162],[ 0.0822,  2.0826],[-0.6343, -0.7222],[ 0.4282,  0.0235],[ 1.4056,  0.3506],[-0.6496, -0.5202],[-0.3969, -0.9951]]) tensor([ 6.0394, -0.3365,  9.5882,  5.1810, -2.7355,  5.3873,  4.9827,  5.7962,4.6727,  6.7921])

我们将模型参数权重初始化成均值为0、标准差为0.01的正态随机数,偏差则初始化成0。

w = torch.tensor(np.random.normal(0, 0.01, (num_inputs, 1)), dtype=torch.float32)
b = torch.zeros(1, dtype=torch.float32)

之后的模型训练中,需要对这些参数求梯度来迭代参数的值,因此我们要让它们的requires_grad=True:

w.requires_grad_(requires_grad=True)
b.requires_grad_(requires_grad=True)

定义模型:

def linreg(X, w, b):  # 矢量表达式return torch.mm(X, w) + bdef squared_loss(y_hat, y):  # 损失函数# 注意这里返回的是向量, 另外, pytorch里的MSELoss并没有除以 2return (y_hat - y.view(y_hat.size())) ** 2 / 2def sgd(params, lr, batch_size):  # 优化算法:小批量随机梯度下降算法for param in params:param.data -= lr * param.grad / batch_size # 注意这里更改param时用的是param.data

在求数值解的优化算法中,小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch),然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。

训练模型:

lr = 0.03 # 学习率
num_epochs = 3
net = linreg
loss = squared_lossfor epoch in range(num_epochs):  # 训练模型一共需要num_epochs个迭代周期# 在每一个迭代周期中,会使用训练数据集中所有样本一次(假设样本数能够被批量大小整除)。X# 和y分别是小批量样本的特征和标签for X, y in data_iter(batch_size, features, labels):l = loss(net(X, w, b), y).sum()  # l是有关小批量X和y的损失l.backward()  # 小批量的损失对模型参数求梯度sgd([w, b], lr, 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.021578
epoch 2, loss 0.000096
epoch 3, loss 0.000050

输出学到的参数和用来生成训练集的真实参数:

print(true_w, '\n', w)
print(true_b, '\n', b)
[2, -3.4] tensor([[ 1.9998],[-3.3998]], requires_grad=True)
4.2 tensor([4.2001], requires_grad=True)

(pytorch-深度学习系列)pytorch实现线性回归相关推荐

  1. [PyTorch] 深度学习框架PyTorch中的概念和函数

    Pytorch的概念 Pytorch最重要的概念是tensor,意为"张量". Variable是能够构建计算图的 tensor(对 tensor 的封装).借用Variable才 ...

  2. 《PyTorch深度学习实践》-P5线性回归

    构造神经网络一般步骤: 1prepare dataset 2design model using Class (计算y_hat) 3consturct loss and optimizer (usin ...

  3. 《动手学深度学习》PyTorch版本

    Dive-Into-Deep-Learning-PyTorch-PDF 简介   本项目对中文版<动手学深度学习>中的代码进行整理,并参考一些优秀的GitHub项目给出基于PyTorch的 ...

  4. 网易云课程:深度学习与PyTorch入门实战

    网易云课程:深度学习与PyTorch入门实战 01 深度学习初见 1.1 深度学习框架简介 1.2 pytorch功能演示 2开发环境安装 3回归问题 3.1简单的回归问题(梯度下降算法) 3.3回归 ...

  5. pytorch深度学习_了解如何使用PyTorch进行深度学习

    pytorch深度学习 PyTorch is an open source machine learning library for Python that facilitates building ...

  6. 深度学习之Pytorch基础教程!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:李祖贤,Datawhale高校群成员,深圳大学 随着深度学习的发展 ...

  7. 深度学习准「研究僧」预习资料:图灵奖得主Yann LeCun《深度学习(Pytorch)》春季课程...

    视学算法报道 编辑:蛋酱 转载自公众号:机器之心 开学进入倒计时,深度学习方向的准「研究僧」们,你们准备好了吗? 转眼 2020 年已经过半,又一届深度学习方向的准研究生即将踏上「炼丹」之路.对于这一 ...

  8. 5天玩转PyTorch深度学习,从GAN到词嵌入都有实例丨教程资源

    郭一璞 发自 凹非寺  量子位 报道 | 公众号 QbitAI 学PyTorch深度学习,可能5天就够了. 法国深度学习研究者Marc Lelarge出品的这套名为<Hands-on tour ...

  9. python tensorflow pytorch 深度学习 车牌识别

    车牌识别相关资料收集整理 1.License Plate Detection with RetinaFace 链接:https://github.com/zeusees/License-Plate-D ...

  10. (d2l-ai/d2l-zh)《动手学深度学习》pytorch 笔记(2)前言(介绍各种机器学习问题)以及数据操作预备知识Ⅰ

    开源项目地址:d2l-ai/d2l-zh 教材官网:https://zh.d2l.ai/ 书介绍:https://zh-v2.d2l.ai/ 笔记基于2021年7月26日发布的版本,书及代码下载地址在 ...

最新文章

  1. koa中使用cookie 和session
  2. 这套“人造肌腱”装备,可保护你的老腰|Science子刊
  3. sata接口_接口不同有啥区别?M.2和SATA接口SSD该选哪种?
  4. http://download.eclipse.org/technology/m2e/releases install error
  5. 每天一个设计模式,工厂方法模式(Factory Method)
  6. Java初学者推荐学习书籍free下载
  7. html 语义化标签拾遗
  8. 【转】在C#中使用SQLite
  9. <button>与<input type =“ button” />。使用哪个?
  10. 设置失败重新发起_微服务架构下请求调用失败了怎么办!
  11. 标段模板、审批流程模板
  12. python调用nmap_Python调用nmap扫描网段主机信息生成xml
  13. 怎么看计算机的硬盘容量,Win7怎么看硬盘大小 如何看电脑硬盘大小
  14. 工作流引擎的流程业务表设计
  15. 《SpringCloud Alibaba 微服务架构》专题(二十三)-Seat工作原理
  16. ZT:【ROOT教程】S7/S7E 8890版root及替换recovery中文教程
  17. win7无线网显示小太阳
  18. NFM(Neural Factorization Machines):模型原理及pytorch代码实现
  19. php mysql字符串截取比较读取_MySQL字符串截取 和 截取字符进行查询
  20. SVN_Windows安装Subversion(svn 命令行工具)教程

热门文章

  1. 电子计算机空调,电子计算机机房空调的设计规范
  2. [go]---从java到go(01)---基础与入门上手
  3. 软件工程作业 - word count
  4. 现代程序设计 作业4
  5. Visual Studio 2010 sp1
  6. Linux如何配置网络IP地址
  7. python db文件_python中查看.db文件中表格的名字及表格中的字段操作
  8. mysql 5.6.14 win32_mysql-5.6.14-win32为免安装解压缩版
  9. 10个简单的 Java 性能调优技巧
  10. 【学习笔记】第二章——调度算法:先来先服务FCFS、短作业优先SJF、高响应比HRRN