Loading [MathJax]/jax/output/CommonHTML/fonts/TeX/AMS-Regular.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度学习-Pytorch张量tensor详解(线性回归实战)

深度学习-Pytorch张量tensor详解(线性回归实战)

作者头像
唔仄lo咚锵
发布于 2023-05-23 02:45:01
发布于 2023-05-23 02:45:01
7290
举报

张量(tensor)是Pytorch中最基本的操作对象,表示一个多维矩阵,类似numpy中的ndarrays,是可以在GPU上使用以加速运算。

创建


直接创建张量:

函数

功能

ones(*sizes)

全1Tensor

zeros(*sizes)

全0Tensor

eye(*sizes)

对⻆线为1,其他为0

arange(s,e,step)

从s到e,步⻓为step

linspace(s,e,steps)

从s到e,均分成steps份

rand/randn(*sizes)

均匀/标准分布

normal(mean,std)

正态分布

randperm(m)

随机排列

代码语言:javascript
AI代码解释
复制
import torch

x1 = torch.rand(2, 3)  # 2×3的随机矩阵
print(x1)

x2 = torch.ones(2, 3, 4)  # 2×3×4的全1矩阵
print(x2)

x3 = torch.arange(1, 10, 2)  # 1-10步长2
print(x3)

print(x1.numel())  # 查看元素数量
print(x2.shape[0])  # 查看第0个维度大小
print(x3.data)  # 查看数据

通过数据创建张量:torch.tensor()

代码语言:javascript
AI代码解释
复制
import torch
import numpy as np

x1 = torch.tensor(666)  # 可以是一个数
print(x1)
print(x1.type())  # 查看数据类型

x2 = torch.tensor([1, 2, 3], dtype=torch.float)  # 创建时指定类型
print(x2)

a = np.random.rand(2, 2)
x3 = torch.from_numpy(a)  # 从numpy创建
print(x3)
print(x3.numpy())  # 转为numpy

运算


基本上各种运算都支持,用的时候查一下文档即可,不再赘述。

  • 基本运算: add、abs、sqrt、div、exp、fmod、pow、sum、means等
  • 三角函数:cos、sin、asin、atan2、cosh等
  • 布尔运算: gt、lt、ge、le、eq、ne、topk、sort、max、min等
  • 线性计算: trace、diag、mm、bmm、t、dot、cross、inverse、svd等

比如加法就有很多写法:

代码语言:javascript
AI代码解释
复制
import torch

x = torch.zeros(2, 2)  #全0
y = torch.ones(2, 2)  #全1
print(x+3)  # 全部+3
print(x+y)  # x+y
print(x.add(y))  # x+y
x.add_(y)  # 改变原x
print(x)

其他一些运算举例:

代码语言:javascript
AI代码解释
复制
import torch

x = torch.rand(2, 2)
print(x)
print("求和:", x.sum(), x.sum().item())  # item打印具体值
print("cos(x):", x.cos())
print("最大值:", x.t())
print("转置:", x.t())
print("逆矩阵:", x.inverse())

使用view()改变张量形状。

代码语言:javascript
AI代码解释
复制
import torch

x = torch.randn(2, 3)  # 2×3
print(x)
print(x.view(3, 2))  # 改成3×2
print(x.view(-1, 1))  # 改成6×1(-1是自动的意思,1是大小)

上述运算中,如果矩阵大小不相同,则会触发广播机制,如:

代码语言:javascript
AI代码解释
复制
import torch

x = torch.ones(1, 2)
y = torch.zeros(3, 1)
print(x+y)

由于x是1行2列,而y是3行1列,在运行加法计算时两者大小不一致。此时触发广播机制,将x的第1行广播(复制)到第2行和第3行,扩容成3行2列;同理,y的第1列广播到第2列,也扩容成3行2列。使得大小一致,得以相加,如答案所见。

插播反爬信息 )博主CSDN地址:https://wzlodq.blog.csdn.net/

微分


若将Torch.Tensor属性requires_ grad设置为True,则Pytorch将开始跟踪对此张量的所有操作。当完成计算后,可以调用backward()并自动计算所有梯度,该张量的梯度将累加到grad属性中。

其实tensor包含了三个属性:data(数据)、grad(梯度)、grad_fn(梯度函数,怎么计算得到的梯度)。

out是一个标量,

out=d(out)dx

,调用out.backward()便可直接计算,不用指定求导变量。

代码语言:javascript
AI代码解释
复制
import torch

x = torch.tensor([1., 2.], requires_grad=True)
print(x.data)  # 数据
print(x.grad)  # 梯度(创建为None
print(x.grad_fn)  # 梯度函数(创建为None
y = x * x
print("y=x*x:", y)
z = y * 3
print("z=y+3:", z)
out = z.mean()  # 求均值
print(out)
out.backward()  # 反向传播
print(x.grad)  # x梯度

手算验证与运行结果一致。

需要特别注意得是,grad是一直累加的,也就是说我们在多轮训练中,每轮调用反向传播后,应把梯度清零,不然影响下一轮求梯度。

代码语言:javascript
AI代码解释
复制
x.grad.data.zero_()  # 清理梯度

如果要中断梯度追踪,使用with torch.no_grad():用于调试追踪等,后续需要继续追踪时加下划线设置true即可。

代码语言:javascript
AI代码解释
复制
import torch

x = torch.tensor([1., 2.], requires_grad=True)
y1 = x * x
print("y1:", y1.requires_grad)
with torch.no_grad():
    y2 = y1 / 3
    print("y2:", y2.requires_grad)
y3 = y2.sqrt()
print("y3:", y3.requires_grad)
y3.requires_grad_(True)
print("y3:", y3.requires_grad)

实战


手动调参和调用模型求解线性回归模型。

代码语言:javascript
AI代码解释
复制
import matplotlib.pyplot as plt
import numpy as np
import torch
from torch import nn

# 数据
X = np.linspace(0, 20, 30, dtype=np.float32)
Y = 3 * X + 10 + np.random.rand(30) * 8
Y = Y.astype(np.float32)
plt.scatter(X, Y)
X = torch.from_numpy(X.reshape(-1, 1))
Y = torch.from_numpy(Y.reshape(-1, 1))

# 1.手动调参
w = torch.randn(1, requires_grad=True)  # 权重w
b = torch.randn(1, requires_grad=True)  # 偏置b
learning_rate = 0.001  # 学习率
for epoch in range(1000):
    for x, y in zip(X, Y):
        y_pre = torch.matmul(x, w) + b
        loss = (y - y_pre).pow(2).mean()
        if not w.grad is None:
            w.grad.data.zero_()  # 梯度清零
        if not b.grad is None:
            b.grad.data.zero_()
        loss.backward()  # 反向传播求解梯度
        with torch.no_grad():  # 优化参数
            w.data -= w.grad.data * learning_rate
            b.data -= b.grad.data * learning_rate
print("手动调参:", w, b)
x = X.numpy()
w = w.detach().numpy()
b = b.detach().numpy()
plt.plot(x, w * x + b, color="red", label="手动调参", alpha=0.8)

# 1.调用调参
model = nn.Linear(1, 1)  # 调用线性模型
loss_fn = nn.MSELoss()  # 损失函数均方误差
opt = torch.optim.SGD(model.parameters(), lr=0.001)  # 随机梯度下降
for epoch in range(1000):
    for x, y in zip(X, Y):
        y_pred = model(x)  # 使用模型预测
        loss = loss_fn(y, y_pred)  # 计算损失
        opt.zero_grad()  # 梯度清零
        loss.backward()  # 反向传播求解梯度
        opt.step()  # 优化参数
print("调用模型:", model.weight, model.bias)
plt.plot(X.numpy(), model(X).data.numpy(), color="green", label="调用模型", alpha=0.8)
plt.legend()
plt.show()

使用机器学习-sklearn库求解,可查看另一篇博客回归-线性回归算法(房价预测项目)

原创不易,请勿转载本不富裕的访问量雪上加霜 ) 博主首页:https://wzlodq.blog.csdn.net/ 来都来了,不评论两句吗👀 如果文章对你有帮助,记得一键三连❤

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PyTorch的4分钟教程,手把手教你完成线性回归
PyTorch深度学习框架库之一,是来自Facebook的开源深度学习平台,提供研究原型到生产部署的无缝衔接。
大数据文摘
2019/07/30
9170
PyTorch的4分钟教程,手把手教你完成线性回归
【PyTorch入门】 张量的介绍及常用函数和数据基础【一】
在人工智能时代,机器学习技术在不断更新,深度学习更是机器学习领域中的一个全新的研究领域和热点方向,深度学习不仅推动了机器学习,更是促进了人工智能时代技术的更迭,已经被成功运用在了语音识别,图像分类识别等领域,有着巨大的发展价值。
机器学习司猫白
2025/01/21
5780
深度学习—3.Pytorch基础
torch.tensor()创建张量共有8个属性:data、dtype、shape、device、requires_grad、grad、grad_fn
全栈程序员站长
2021/10/08
3770
【动手学深度学习】深入浅出深度学习之PyTorch基础
启动jupyter notebook,使用新增的pytorch环境新建ipynb文件,为了检查环境配置是否合理,输入import torch以及torch.cuda.is_available() ,若返回TRUE则说明实验环境配置正确,若返回False但可以正确导入torch则说明pytorch配置成功,但实验运行是在CPU进行的,结果如下:
SarPro
2024/04/02
7640
【动手学深度学习】深入浅出深度学习之PyTorch基础
【深度学习入门篇①】手动完成线性回归!
大家好!今天我们将一起踏上一场探索深度学习的奇妙之旅,而我们的起点,就是线性回归这一经典而基础的算法。我将带大家从零开始,手动实现线性回归!
@小森
2024/07/25
2190
【深度学习入门篇①】手动完成线性回归!
PyTorch: 张量的变换、数学运算及线性回归
功能:2 维张量转置,对矩阵而言,等价于torch.transpose(input, 0, 1)
timerring
2022/11/12
1.2K0
PyTorch: 张量的变换、数学运算及线性回归
【动手学深度学习笔记】之线性回归实现
这一节不牵扯深度学习框架,仅使用Tensor和autograd库来训练线性回归模型。
树枝990
2020/08/20
7740
Pytorch: autograd与逻辑回归的实现
torch.autograd.backward ( tensors, grad_tensors=None,retain_graph=None,create_graph=False)
timerring
2023/07/20
3850
Pytorch: autograd与逻辑回归的实现
深度学习 | 《深度学习入门之PyTorch》阅读笔记
KDD(knowledge discovery in database),从数据中获取有意义的信息
Justlovesmile
2021/12/14
1.7K0
深度学习 | 《深度学习入门之PyTorch》阅读笔记
快速入门Pytorch(1)--安装、张量以及梯度
https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html
kbsc13
2019/08/16
8730
【Pytorch】笔记一:数据载体张量与线性回归
疫情在家的这段时间,系统的学习一遍 Pytorch 基础知识,因为我发现虽然直接 Pytorch 实战上手比较快,但是关于一些内部的原理知识其实并不是太懂,这样学习起来感觉很不踏实, 对 Pytorch 的使用依然是模模糊糊, 跟着人家的代码用 Pytorch 玩神经网络还行,也能读懂,但自己亲手做的时候,直接无从下手,啥也想不起来, 我觉得我这种情况就不是对于某个程序练得不熟了,而是对 Pytorch 本身在自己的脑海根本没有形成一个概念框架,不知道它内部运行原理和逻辑,所以自己写的时候没法形成一个代码逻辑,就无从下手。这种情况即使背过人家这个程序,那也只是某个程序而已,不能说会 Pytorch, 并且这种背程序的思想本身就很可怕, 所以我还是习惯学习知识先有框架(至少先知道有啥东西)然后再通过实战(各个东西具体咋用)来填充这个框架。而「这个系列的目的就是在脑海中先建一个 Pytorch 的基本框架出来, 学习知识,知其然,知其所以然才更有意思」。
阿泽 Crz
2020/08/28
3K0
【Pytorch】笔记一:数据载体张量与线性回归
PyTorch 2.2 中文官方教程(二)
介绍 || 张量 || 自动微分 || 构建模型 || TensorBoard 支持 || 训练模型 || 模型理解
ApacheCN_飞龙
2024/02/05
8340
PyTorch 2.2 中文官方教程(二)
PyTorch 深度学习入门
深度学习是机器学习的一个分支,其中编写了模仿人脑功能的算法。深度学习中最常用的库是 Tensorflow 和 PyTorch。由于有各种可用的深度学习框架,人们可能想知道何时使用 PyTorch。以下是人们可能更喜欢将 Pytorch 用于特定任务的原因。
海拥
2022/06/15
1.4K0
PyTorch 深度学习入门
「深度学习」PyTorch笔记-01-基础知识
互联网万物基于ChatGPT,学习深度学习之前,先来请教一下ChatGPT如何进行学习。
曼亚灿
2023/05/18
1.1K0
「深度学习」PyTorch笔记-01-基础知识
「深度学习一遍过」必修10:pytorch 框架的使用
CenterCrop,ColorJitter,FiveCrop,Grayscale,Pad,RandomAffine,RandomApply, RandomCrop,RandomGrayscale, RandomHorizontalFlip,RandomPerspective,RandomResizedCrop,RandomRotation, RandomSizedCrop, RandomVerticalFlip, Resize,Scale,TenCrop,GaussianBlur,RandomChoice,RandomOrder, LinearTransformation,Normalize,RandomErasing,ConvertImageDtype, ToPILImage,ToTensor,Lambda
荣仔_最靓的仔
2022/01/10
6920
「深度学习一遍过」必修10:pytorch 框架的使用
线性神经网路——线性回归随笔【深度学习】【PyTorch】【d2l】
3.1、线性回归 线性回归是显式解,深度学习中绝大多数遇到的都是隐式解。 3.1.1、PyTorch 从零实现线性回归 %matplotlib inline import random impo
来杯Sherry
2023/07/24
9920
[源码解析]深度学习利器之自动微分(3) --- 示例解读
本文从 PyTorch 两篇官方文档开始为大家解读两个示例。本文不会逐句翻译,而是选取重点并且试图加入自己的理解。
罗西的思考
2021/10/20
1.6K0
PyTorch 学习笔记
PS: 为了方便最好是将 conda 和 pip 的软件源修改成内地源,这样的话,使用 conda 或者 pip 安装软件速度会快很多,你可以点击 这里 了解如何对 conda 和 pip 进行换源。
EmoryHuang
2022/10/31
8650
PyTorch 学习笔记
【专知国庆特刊-PyTorch手把手深度学习教程系列01】一文带你入门优雅的PyTorch
【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工智能( 机器学习、自然语言处理、计算机视觉等)、大数据、编程语言、系统架构。使用请访问专知 进行主题搜索查看 - 桌面电脑访问www.zhuanzhi.ai, 手机端访问www.zhuanzhi.ai 或关注微信公众号后台回复" 专知"进入专知,搜索主题查看。值国庆佳节,专知特别推出独家特刊-来自中科院自动化所专知小组博士生huaiwen和Jin创作的-PyTorch教程学习系列。 <
WZEARW
2018/04/08
2.2K0
【专知国庆特刊-PyTorch手把手深度学习教程系列01】一文带你入门优雅的PyTorch
pytorch入坑之Tensor
张量 标量:0维张量 向量:1维张量 矩阵:2维张量 张量:一个多维数组,标量、向量、矩阵的高维扩展 Tensor
Max超
2020/03/27
1.4K0
推荐阅读
相关推荐
PyTorch的4分钟教程,手把手教你完成线性回归
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档