1.矢量计算表达式

在模型训练或预测时,我们常常会同时处理多个数据样本并用到矢量计算。

在介绍线性回归的矢量计算表达式之前,让我们先考虑对两个向量相加的两种方法。

import torch
from time import time#下面先定义两个1000维的向量。
a = 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.17760944366455078
"""向量相加的另一种方法是,将这两个向量直接做矢量加法。"""
start = time()
d = a + b
print(time() - start)
0.0

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

y=w∗x+by = w*x + by=w∗x+b,其中会涉及广播操作

  • 和大多数深度学习模型一样,对于线性回归这样一种单层神经网络,它的基本要素包括模型、训练数据、损失函数和优化算法。
  • 既可以用神经网络图表示线性回归,又可以用矢量计算表示该模型。
  • 应该尽可能采用矢量计算,以提升计算效率。

2.线性回归的从零开始实现

本节将介绍如何只利用Tensorautograd来实现一个线性回归的训练。

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

%matplotlib inline
import torch
from IPython import display
from matplotlib import pyplot as plt
import numpy as np
import random

2.1生成数据集

我们构造一个简单的人工训练数据集,它可以使我们能够直观比较学到的参数和真实的模型参数的区别。设训练数据集样本数为1000,输入个数(特征数)为2。给定随机生成的批量样本特征X∈R1000×2,我们使用线性回归模型真实权重w=[2,−3.4]T和偏差b=4.2,以及一个随机噪声项ϵ来生成标签X\in R^{1000}\times2,我们使用线性回归模型真实权重 w=[2,−3.4]^T和偏差b=4.2,以及一个随机噪声项\epsilon来生成标签X∈R1000×2,我们使用线性回归模型真实权重w=[2,−3.4]T和偏差b=4.2,以及一个随机噪声项ϵ来生成标签
y=Xw+b+ϵy=Xw + b + \epsilony=Xw+b+ϵ
其中噪声项 ϵ\epsilonϵ 服从均值为0、标准差为0.01的正态分布。噪声代表了数据集中无意义的干扰。

下面,让我们生成数据集。

num_inputs = 2
num_examples = 1000true_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 #广播机制labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()),dtype=torch.float32)

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

print(features[0], labels[0])
tensor([-1.3030, -0.2948]) tensor(2.6039)

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

def use_svg_display():# 用矢量图显示display.set_matplotlib_formats('svg')def set_figsize(figsize=(3.5, 2.5)):use_svg_display()# 设置图的尺寸plt.rcParams['figure.figsize'] = figsize# # 在../d2lzh_pytorch里面添加上面两个函数后就可以这样导入
# import sys
# sys.path.append("..")
# from d2lzh_pytorch import * set_figsize()
plt.scatter(features[:, 1].numpy(), labels.numpy(), 1);  #将张量分量转成Numpy,绘制散点图


可以将上面的plt作图函数以及use_svg_display函数和set_figsize函数定义在d2lzh_pytorch包里。以后在作图时,我们将直接调用d2lzh_pytorch.plt。由于plt在d2lzh_pytorch包中是一个全局变量,我们在作图前只需要调用d2lzh_pytorch.set_figsize()即可打印矢量图并设置图的尺寸。

2.2 读取数据

在训练模型的时候,我们需要遍历数据集并不断读取小批量数据样本。

这里我们定义一个函数:它每次返回batch_size(批量大小)个随机样本的特征和标签。

print("样本数:",len(features))
print("张量的形状:",features.shape)indicies = list(range(10))
m = torch.LongTensor(indicies[3:8])
print(indicies,m)
样本数: 1000
张量的形状: torch.Size([1000, 2])
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] tensor([3, 4, 5, 6, 7])
# 可以将本函数已保存在d2lzh包中方便以后使用
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)]) # 最后一次可能不足一个batch【切片 索引下标】yield  features.index_select(0, j), labels.index_select(0, j)#torch.index_select(a, 0, torch.tensor([0, 2])),表索引。【索引0 行和 2行】#第一个参数是索引的对象,第二个参数0表示按行索引,1表示按列进行索引,第三个参数是一个tensor,就是索引的序号

带yield的函数是一个生成器,而不是一个函数了,减少空间占用,有点类似return

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

batch_size = 10for X, y in data_iter(batch_size, features, labels):print(X, y)break     #查看第一组
tensor([[ 0.8058,  0.1712],[ 2.2578, -0.3343],[-0.7530,  0.5661],[-0.1106,  0.9406],[-0.1610,  0.4102],[ 0.5701, -0.2975],[-0.6603,  0.3892],[ 0.2693,  0.4400],[ 1.4730, -0.5962],[ 0.3603, -1.3795]]) tensor([5.2385, 9.8495, 0.7590, 0.7866, 2.4841, 6.3524, 1.5744, 3.2403, 9.1731,9.5910])

2.3初始化模型参数

将权重初始化成均值为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)
tensor([0.], requires_grad=True)

2.4定义模型

线性回归的矢量计算表达式的实现。我们使用mm函数做矩阵乘法。

def linreg(X, w, b):  # 本函数已保存在d2lzh_pytorch包中方便以后使用return torch.mm(X, w) + b
  • torch.mul(a, b)是矩阵a和b对应位相乘,a和b的维度必须相等,比如a的维度是(1, 2),b的维度是(1, 2),返回的仍是(1, 2)的矩阵
  • torch.mm(a, b)是矩阵a和b矩阵相乘,比如a的维度是(1, 2),b的维度是(2, 3),返回的就是(1, 3)的矩阵

2.5 定义损失函数

平方损失来定义线性回归的损失函数。在实现中,我们需要把真实值y变形成预测值y_hat的形状。

以下函数返回的结果也将和y_hat的形状相同。

def squared_loss(y_hat, y):  # 本函数可保存在d2lzh_pytorch包中方便以后使用# 注意这里返回的是向量, 另外, pytorch里的MSELoss并没有除以 2return (y_hat - y.view(y_hat.size())) ** 2 / 2

2.6定义优化算法

以下的sgd函数实现了小批量随机梯度下降算法。它通过不断迭代模型参数来优化损失函数。

这里自动求梯度模块计算得来的梯度是一个批量样本的梯度和。我们将它除以批量大小来得到平均值。采用param.data

def sgd(params, lr, batch_size):  for param in params:param.data -= lr * param.grad / batch_size # 注意这里更改param时用的param.data

2.7 训练模型

在训练中,我们将多次迭代模型参数。在每次迭代中,我们根据当前读取的小批量数据样本(特征X和标签y),通过调用反向函数backward计算小批量随机梯度,并调用优化算法sgd迭代模型参数。由于我们之前设批量大小batch_size为10,每个小批量的损失l的形状为(10, 1)。回忆一下自动求梯度一节。由于变量l并不是一个标量,所以我们可以调用**.sum()将其求和得到一个标量,再运行#l.backward() 得到该变量有关模型参数的梯度。注意在每次更新完参数后不要忘了将参数的梯度清零**。

在一个迭代周期(epoch)中,我们将完整遍历一遍data_iter函数,并对训练数据集中所有样本都使用一次(假设样本数能够被批量大小整除)。这里的迭代周期个数num_epochs和学习率lr都是超参数,分别设3和0.03。在实践中,大多超参数都需要通过反复试错来不断调节。虽然迭代周期数设得越大模型可能越有效,但是训练时间可能过长。而有关学习率对模型的影响,在后面“优化算法”一章中详细介绍。

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.045182
epoch 2, loss 0.000177
epoch 3, loss 0.000051

训练完成后,我们可以比较学到的参数和用来生成训练集的真实参数。它们应该很接近。

print(true_w, '\n', w)
print(true_b, '\n', b)
[2, -3.4] tensor([[ 1.9999],[-3.3992]], requires_grad=True)
4.2 tensor([4.1992], requires_grad=True)

(如果觉得有帮助,请给个小赞,多谢啦)

Pytorch学习_线性回归(1)相关推荐

  1. pytorch 入门学习 实现线性回归-5

    pytorch 入门学习实现线性回归 使用pytorch实现线性回归 import numpy as np import matplotlib.pyplot as plt import torch#p ...

  2. 【从线性回归到 卷积神经网络CNN 循环神经网络RNN Pytorch 学习笔记 目录整合 源码解读 B站刘二大人 绪论(0/10)】

    深度学习 Pytorch 学习笔记 目录整合 数学推导与源码详解 B站刘二大人 目录传送门: 线性模型 Linear-Model 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人( ...

  3. pytorch图像分类_使用PyTorch和Streamlit创建图像分类Web应用

    pytorch图像分类 You just developed a cool ML model. 您刚刚开发了一个很酷的ML模型. You are proud of it. You want to sh ...

  4. PyTorch学习笔记2:nn.Module、优化器、模型的保存和加载、TensorBoard

    文章目录 一.nn.Module 1.1 nn.Module的调用 1.2 线性回归的实现 二.损失函数 三.优化器 3.1.1 SGD优化器 3.1.2 Adagrad优化器 3.2 分层学习率 3 ...

  5. 2_初学者快速掌握主流深度学习框架Tensorflow、Keras、Pytorch学习代码(20181211)

    初学者快速掌握主流深度学习框架Tensorflow.Keras.Pytorch学习代码 一.TensorFlow 1.资源地址: 2.资源介绍: 3.配置环境: 4.资源目录: 二.Keras 1.资 ...

  6. Pytorch学习-torch.max()和min()深度解析

    Pytorch学习-torch.max和min深度解析 max的使用 min同理 dim参数理解 二维张量使用max() 三维张量使用max() max的使用 min同理 参考链接: 参考链接: 对于 ...

  7. Pytorch学习-Task1

    PyTorch学习-Task1:PyTorch张量计算与Numpy的转换 张量 Tensor 1.张量的定义 2.张量的运算 3.Tensor与Numpy类型的转换 4.自动求导 pytorch 与神 ...

  8. pytorch 学习: STGCN

    1 main.ipynb 1.1 导入库 import random import torch import numpy as np import pandas as pd from sklearn. ...

  9. pytorch 学习笔记目录

    1 部分内容 pytorch笔记 pytorch模型中的parameter与buffer_刘文巾的博客-CSDN博客 pytorch学习笔记 torchnn.ModuleList_刘文巾的博客-CSD ...

最新文章

  1. Linux 下磁盘配额(RHEL5)
  2. matlab 2014a 升级,MATLAB R2014a从入门到精通(升级版) pdf扫描版[42MB]
  3. java线性表_java实现线性表
  4. Tomcat 8.5.29启动报TldScanner.scanJars错误问题解决办法
  5. 正则表达式:Pattern 与Matcher
  6. android miui ios,从iOS到Android——小米11及小米生态实际使用体验
  7. Adobe Acrobat Pro DC二次激活失败的解决途径
  8. 【目标检测】IoU(交并比)详解及代码实现
  9. python训练营微信广告发送机_python实现给微信公众号发送消息的方法
  10. CODE[VS] 1548 贝贝的车牌问题
  11. window下搭建qt开发环境编译、引用ace
  12. 零基础实战Keras模型转化为RKNN格式模型成功运行在RK3399Pro板子上
  13. 阶段3 1.Mybatis_01.Mybatis课程介绍及环境搭建_06.mybatis的环境搭建
  14. 电脑网页无法解析服务器dns,电脑无法解析服务器dns地址怎么办
  15. 基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建
  16. ClickOnce踩坑记录
  17. 为micropython添加模块(2)-类模块
  18. pikachu靶场SQL,sqlmap解法
  19. 关于C#英文注释改成中文注释
  20. [搬家]打造自己的嵌入式系统,防火墙或路由器

热门文章

  1. 【Unity 3D】3D游戏跑酷小子实战教学(附源码和步骤 超详细)
  2. 曾经欠的“债”,迟早都要还的
  3. acme证书安装,免费给网站配置https证书
  4. 实验室是否应该运行LIMS实验室系统?
  5. 塔望食业洞察|茶饮小料市场发展现状、消费洞察及趋势思考
  6. 好用直观的【MES制造执行系统】
  7. CTF学习 - Crypto - [Poor Megan] - DEADFACE 2021
  8. iPhone手机被盗后,小偷是如何解锁密码的?看完长知识了
  9. 友益文书软件加密深度分析
  10. htc A315 android usb驱动安装