pytorch实战 -- 初窥张量

news2024/11/23 19:48:20

张量的创建

张量(Tensors)类似于NumPy的ndarrays,但张量可以在GPU上进行计算。 所以从本质上来说,PyTorch是一个处理张量的库。一个张量是一个数字、向量、矩阵或任何n维数组。
下面分别展示了0维张量到n位张量:
在这里插入图片描述

import torch
import numpy
torch.manual_seed(7) # 固定随机数种子

'''
<torch._C.Generator at 0x7f168427f780>
'''

一、直接创建

  1. torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False)
  2. 功能:从data创建tensor
    data: 数据,可以是list,numpy
    dtype: 数据类型,默认与data的一致
    device: 所在设备,cuda/cpu
    requires_grad: 是否需要梯度
    pin_memory: 是否存于锁页内存
torch.tensor([[0.1, 1.2], [2.2, 3.1], [4.9, 5.2]])

'''
tensor([[0.1000, 1.2000],
,        [2.2000, 3.1000],
,        [4.9000, 5.2000]])
'''
  1. torch.from_numpy(ndarray)
  2. 功能:从numpy创建tensor
    注意事项:从torch.from_numpy创建的tensor于原ndarray共享内存,当修改其中一个数据,另一个也将会被改动。
a = numpy.array([1, 2, 3])
t = torch.from_numpy(a)

二、依据数值创建

  1. torch.zeros(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  2. 功能:依size创建全0张量
    size: 张量的形状,如(3, 3)、(3, 224, 224)
    out: 输出的张量
    layout: 内存中布局形式,有strided, sparse_coo等
    device: 所在设备,gpu/cpu
    requires_grad: 是否需要梯度
torch.zeros(2, 3)

'''
tensor([[0., 0., 0.],
,        [0., 0., 0.]])
'''
  1. torch.zeros_like(input, dtype=None, layout=None, device=None, requires_grad=False)
  2. 功能:依input形状创建全0张量
    input: 创建与input同形状的全0张量
    dtype: 数据类型
    layout: 内存中布局形式
input = torch.empty(2, 3)
torch.zeros_like(input)

'''
tensor([[0., 0., 0.],
,        [0., 0., 0.]])
'''

torch.ones(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

torch.ones(2, 3)

'''
tensor([[1., 1., 1.],
,        [1., 1., 1.]])
'''
  1. torch.ones_like(input, dtype=None, layout=None, device=None, requires_grad=False)
  2. 功能:依input形状创建全1张量
    size: 张量的形状,如(3, 3)、(3, 224, 224)
    dtype: 数据类型
    layout: 内存中布局形式
    device: 所在设备,gpu/cpu
    requires_grad: 是否需要梯度
input = torch.empty(2, 3)
torch.ones_like(input)

'''
tensor([[1., 1., 1.],
,        [1., 1., 1.]])
'''

torch.full(size, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

torch.full((2, 3), 3.141592)

'''
tensor([[3.1416, 3.1416, 3.1416],
,        [3.1416, 3.1416, 3.1416]])
'''
  1. torch.full_like(input, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  2. 功能: 依input形状创建指定数据的张量
    size: 张量的形状,如(3, 3)
    fill_value: 张量的值
  3. torch.arange(start=0, end. step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  4. 功能:创建等差的1维张量
    start: 数列起始值
    end: 数列“结束值”
    step: 数列公差,默认为1
  5. 注意事项:数值区间为 [start, end)
torch.arange(1, 2.5, 0.5)

'''
tensor([1.0000, 1.5000, 2.0000])
'''
  1. torch.linspace(start, end, steps=100, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  2. 功能:创建均分的1维张量
    start: 数列起始值
    end: 数列结束值
    steps: 数列长度
torch.linspace(start=-10, end=10, steps=5)

'''
tensor([-10.,  -5.,   0.,   5.,  10.])
'''
  1. torch.logspace(start, end, steps=100, base=10.0, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  2. 功能: 创建对数均分的1维张量
  3. 注意事项:长度为steps,底为base
    start: 数列起始值
    end: 数列结束值
    steps: 数列长度
    base: 对数函数的底,默认为10
torch.logspace(start=0.1, end=1.0, steps=5)

'''
tensor([ 1.2589,  2.1135,  3.5481,  5.9566, 10.0000])
'''
  1. torch.eye(n, m=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  2. 功能: 创建单位对角矩阵(2维张量)
  3. 注意事项:默认为方阵
    n:矩阵行数
    m:矩阵列数
torch.eye(3)

'''
tensor([[1., 0., 0.],
,        [0., 1., 0.],
,        [0., 0., 1.]])
'''

三、依概率分布创建张量

  1. torch.normal(mean, std, out=None)
  2. 功能:生成正态分布(高斯分布)
    mean: 均值
    std: 标准差
  3. 四种模式:
    mean为标量,std为标量
    mean为标量,std为张量
    mean为张量,std为标量
    mean为张量,std为张量
# mean为张量, std为张量
torch.normal(mean=torch.arange(1., 11.), std=torch.arange(1, 0, -0.1))

'''
tensor([0.8532, 2.7075, 3.7575, 3.2200, 6.0145, 5.5526, 6.8577, 8.3697, 9.0276,
,        9.8318])
'''
  1. torch.normal(mean, std, size, out=None)
  2. 功能:生成一定大小的生成正态分布(高斯分布)
torch.normal(2, 3, size=(1, 4))

'''
tensor([[2.9530, 2.3984, 2.4120, 2.7216]])
'''
  1. torch.randn(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  2. 功能:生成标准正态分布
    size: 张量的形状
torch.randn(2, 3)

'''
tensor([[1.3955, 1.3470, 2.4382],
,        [0.2028, 2.4505, 2.0256]])
'''
  1. torch.rand(*size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  2. 功能:在区间 [0,1)上,生成均匀分布
torch.rand(2, 3)

'''
tensor([[0.7405, 0.2529, 0.2332],
,        [0.9314, 0.9575, 0.5575]])
'''
  1. torch.randint(low=0, high, size, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  2. 功能:区间 [low,high)生成整数均匀分布
    size:张量的形状
torch.randint(3, 10, (2, 2))

'''
tensor([[4, 8],
,        [7, 8]])
'''
  1. torch.randperm(n, out=None, dtype=torch.int64, layout=torch.strided, device=None, requires_grad=False)
  2. 功能:生成从0到n-1的随机排列
    n:张量的长度
torch.randperm(4)

'''
tensor([1, 3, 0, 2])
'''
  1. torch.bernoulli(input, *, generator=None, out=None)
  2. 功能:以input为概率,生成伯努利分布(0-1分布,两点分布)
    input:概率值
a = torch.empty(3, 3).uniform_(0, 1)
torch.bernoulli(a)

'''
tensor([[0., 0., 1.],
,        [0., 1., 1.],
,        [1., 0., 1.]])
'''

张量的操作

一、张量拼接与切分

  1. torch.cat(tensors, dim=0, out=None)
  2. 功能:将张量按维度dim进行拼接
    tensors:张量序列
    dim:要拼接的维度
x = torch.randn(2, 3)
torch.cat((x, x, x), 1)

'''
tensor([[-1.7038,  0.6248,  0.1196, -1.7038,  0.6248,  0.1196, -1.7038,  0.6248,
,          0.1196],
,        [-0.8049,  1.6162,  0.2516, -0.8049,  1.6162,  0.2516, -0.8049,  1.6162,
,          0.2516]])
'''
  1. torch.stack(tensors, dim=0, out=None)
  2. 功能:在新创建的维度dim上进行拼接
    tensors:张量序列
    dim:要拼接的维度
  3. torch.chunk(input, chunks, dim=0)
  4. 功能:将张量按维度dim进行平均切分
  5. 返回值:张量列表
  6. 注意事项:若不能整除,最后一份张量小于其他张量
    input:要切分的张量
    chunks:要切分的份数
    dim:要切分的维度
  7. torch.split(tensor, split_size_or_sections, dim=0)
  8. 功能:将张量按维度dim进行切分
  9. 返回值:张量列表
    tensor:要切分的张量
    split_size_or_sections:为int时,表示每一份的长度;为list时,按list元素切分
    dim:要切分的维度
a = torch.arange(10).reshape(5,2)
torch.split(a, 2)

'''
(tensor([[0, 1],
,         [2, 3]]), tensor([[4, 5],
,         [6, 7]]), tensor([[8, 9]]))
'''

张量索引

  1. torch.index_select(input, dim, index, out=None)
  2. 功能:在维度dim上,按index索引数据
  3. 返回值:依index索引数据拼接的张量
    index:要索引的张量
    dim:要索引的维度
    index:要索引数据的序号
x = torch.randn(3, 4)
indices = torch.tensor([0, 2])
torch.index_select(x, 0, indices)

'''
tensor([[-0.0510,  0.1323,  0.3916,  1.0830],
,        [ 0.3809,  0.2569, -1.0273,  0.4999]])
'''
  1. torch.masked_select(input, mask, out=None)
  2. 功能:按mask中的True进行索引
  3. 返回值:一维张量
    input:要索引的张量
    mask:与input同形状的布尔类型张量
x = torch.randn(3, 4)
mask = x.ge(0.5)
torch.masked_select(x, mask)

'''
tensor([0.5054, 0.8079])
'''

三、张量变换

  1. torch.reshape(input, shape)
  2. 功能:变换张量形状
  3. 注意事项:当张量在内存中是连续时,新张量与input共享数据内存
    input:要变换的张量
    shape:新张量的形状
a = torch.arange(4.)
torch.reshape(a, (2, 2))

'''
tensor([[0., 1.],
,        [2., 3.]])
'''
  1. torch.transpose(input, dim0, dim1)
  2. 功能:交换张量的两个维度
    input:要交换的张量
    dim0:要交换的维度
    dim1:要交换的维度
x = torch.randn(2, 3)
torch.transpose(x, 0, 1)

'''
tensor([[ 0.0096,  0.4506],
,        [-0.5704,  0.4101],
,        [-0.1722,  0.8957]])
'''
  1. torch.t(input)
  2. 功能:2维张量转置,对矩阵而言,等价于torch.transpose(input, 0, 1)
x = torch.randn(())
torch.t(x)

'''
tensor(-0.2882)
'''
  1. torch.squeeze(input, dim=None, out=None)
  2. 功能:压缩长度为1的维度(轴)
    dim:若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1时,可以被移除
x = torch.zeros(2, 1, 2, 1, 2)
y = torch.squeeze(x)
  1. torch.unsqueeze(input, dim, out=None)
  2. 功能:依据dim扩展维度
    dim:扩展的维度
x = torch.tensor([1, 2, 3, 4])
torch.unsqueeze(x, 0)

'''
tensor([[1, 2, 3, 4]])
'''

线性回归模型实例

在这里插入图片描述
下面我们开始写一个线性回归模型:

# 首先我们得有训练样本X,Y, 这里我们随机生成
x = torch.rand(20, 1) * 10
y = 2 * x + (5 + torch.randn(20, 1))

# 构建线性回归函数的参数
w = torch.randn((1), requires_grad=True)
b = torch.zeros((1), requires_grad=True)   # 这俩都需要求梯度

# 设置学习率lr为0.1
lr = 0.1

for iteration in range(100):
    # 前向传播
    wx = torch.mul(w, x)
    y_pred = torch.add(wx, b)
 
    # 计算loss
    loss = (0.5 * (y-y_pred)**2).mean()
 
    # 反向传播
    loss.backward()
 
    # 更新参数
    b.data.sub_(lr * b.grad)    # 这种_的加法操作时从自身减,相当于-=
    w.data.sub_(lr * w.grad)

    # 梯度清零
    w.grad.data.zero_()
    b.grad.data.zero_()

print(w.data, b.data)

'''
tensor([-1.0229e+36]) tensor([-1.6542e+35])
'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/601344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SVN客户端的下载和安装(图文超详细)

目录 0.准备工作 1.SVN客户端安装包安装 2.安装语言包 0.准备工作 博主安装环境&#xff1a;windows x86 SVN客户端下载地址&#xff1a;下载 SVN (tortoisesvn.net) 【下载地址中需下载符合电脑版本的安装包&#xff0c;以及语言包】 注&#xff1a;下载两个包后&#…

Linux操作系统相关介绍

目录 一、认识Linux 二、Linux特点总结 三、Linux版本 &#xff08;1&#xff09;Linux内核版 &#xff08;2&#xff09;Linux发行版 一、认识Linux • 1991年&#xff0c;芬兰的一名大学生Linus Torvalds开发了linux内核 • Linux是一种开放源代码的、自由的、免费的类…

Zookeeper面试这一篇就够了

谈下你对 Zookeeper 的认识&#xff1f; ZooKeeper 是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。 ZooKeeper 的目标就是封装好…

面试官:“你知道什么情况下 HTTPS 不安全么”

面试官&#xff1a;“HTTPS的加密过程你知道么&#xff1f;” 我&#xff1a;“那肯定知道啊。” 面试官&#xff1a;“那你知道什么情况下 HTTPS 不安全么” 我&#xff1a;“这....” 越面觉得自己越菜&#xff0c;继续努力学习&#xff01;&#xff01;&#xff01; 什麽是中…

STM32使用HAL库,串口收发一段时间后出错问题及解决

STM32使用HAL库&#xff0c;串口收发一段时间后出错 问题及解决方法问题1&#xff1a;串口溢出解决方法问题2&#xff1a;串口同时收发&#xff0c;一段时间后串口接收不工作解决办法 问题及解决方法 当STM32使用HAL库进行开发时&#xff0c;偶尔会遇到串口收发数据量大时&…

开源创新 协同融合|2023 开放原子全球开源峰会开源协作平台分论坛即将启幕

由开放原子开源基金会主办&#xff0c;阿里云、CSDN 等单位共同承办的开源协作平台分论坛即将于 6 月 12 日上午在北京经开区北人亦创国际会展中心隆重召开。作为 2023 开放原子全球开源峰会的重要组成部分&#xff0c;开源协作平台分论坛将聚焦于开源代码平台的创新功能、用户…

[Halcon3D] 3D重要算子及简单处理点云模型求高度示例讲解

&#x1f4e2;博客主页&#xff1a;https://loewen.blog.csdn.net&#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;本文由 丶布布原创&#xff0c;首发于 CSDN&#xff0c;转载注明出处&#x1f649;&#x1f4e2;现…

(转载)基于粒子群算法的PID控制器优化设计(matlab实现)

1 理论基础 PID控制器应用广泛&#xff0c;其一般形式为 可见&#xff0c;PID控制器的性能取决于Kp、Ki、Kd这3个参数是否合理&#xff0c;因此&#xff0c;优化PID控制器参数具有重要意义。目前&#xff0c;PID控制器参数主要是人工调整&#xff0c;这种方法不仅费时&#x…

PaaS平台iuap——数智底座支撑企业的全球化业务拓展

数智化转型是全球化企业非常关注的话题&#xff0c;数智化转型过程中suo 面临的问题与挑战也绝非一套简单的产品能够解决的&#xff0c;必须配合组织、人员、目标制度采用达成目标。iuap平台是整个企业数智化转型的底座&#xff0c;形象来说是我们的土壤&#xff0c;在这个土壤…

借助Aspose.BarCode,轻松实现QR和众多二维码在线扫描

Aspose.BarCode for .NET 是一个功能强大的API&#xff0c;可以从任意角度生成和识别多种图像类型的一维和二维条形码。开发人员可以轻松添加条形码生成和识别功能&#xff0c;以及在.NET应用程序中将生成的条形码导出为高质量的图像格式。 Aspose API支持流行文件格式处理&am…

postgresql多行转一列,再转多列

问题&#xff1a;某个单据明细表需要加上两列审批人 已有数据&#xff1a;单据表&#xff0c;审批记录表 实现&#xff1a; select billno ,split_part(string_agg(checkman,,),,,1) checkman1 ,split_part(string_agg(checkman,,),,,2) checkman2 from ods_workflownote GR…

指数对数计算公式基础知识

指数对数实际中也是比较重要的公式

浅谈智能配电系统在水务行业的应用

关注acrelzxz 摘要&#xff1a;在构建智慧水务和“双碳”时代背景下&#xff0c;智能配电系统在水务行业中发挥日益突出的重要作用。本文首先回顾了智能配电系统在水务行业的发展历程&#xff0c;并对其应用现状进行了分析&#xff0c;进而展望了智能配电系统在水务行业的发展…

不要再犯这些错误了!电脑使用误区大揭秘

本文是向大家介绍关于电脑的误区&#xff0c;电脑是较为贵重的一个电子产品&#xff0c;熟练掌握基本的电脑操作技巧应该是每一个人必备技能。在使用技巧之外&#xff0c;有一些误区是需要我们知道并避免的。 误区一&#xff1a;重装系统对电脑损耗极大 重装系统的损耗和玩游戏…

基于java语言编写的爬虫程序

Java语言可以使用Jsoup、HttpClient等库进行网络爬虫开发&#xff0c;其中Jsoup提供了HTML解析和DOM操作的功能&#xff0c;HttpClient则提供了HTTP协议的支持。你可以通过使用这些库&#xff0c;构建网络爬虫程序来爬取指定网站的数据。需要注意的是&#xff0c;应该遵守网站的…

chatgpt赋能python:Python函数未定义:如何解决?

Python函数未定义&#xff1a;如何解决&#xff1f; 在Python编程过程中&#xff0c;我们可能会遇到函数未定义的问题。这种错误会导致代码无法正常运行&#xff0c;对于开发者而言是非常头疼的问题。本文将介绍函数未定义的原因及解决方案&#xff0c;帮助您更好地解决这个问…

电脑文件怎么加密?文件设置密码保护的方法

在使用电脑的过程中&#xff0c;我们可能需要在计算机上保存各种文件&#xff0c;这其中就有十分重要的文件数据&#xff0c;而为了避免数据泄露事件的发生&#xff0c;我们需要使用合理的方法保护它们。文件加密就是最简单且有效的方法。那么电脑文件该怎么加密呢&#xff1f;…

Linux:LNMP的架构与环境配置

Linux&#xff1a;LNMP的架构与环境配置 一、安装 Nginx 服务1.1 安装依赖包1.2 创建运行用户1.3 编译安装1.4 优化路径1.5 添加 Nginx 系统服务 二、安装 MySQL 服务2.1安装Mysql环境依赖包2.2 创建运行用户2.3 编译安装2.4 修改mysql 配置文件2.5 更改mysql安装目录和配置文件…

VMware vCenter Server 8.0U1a 发布 - 集中式管理 vSphere 环境

VMware vCenter Server 8.0U1a 发布 - 集中式管理 vSphere 环境 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-vcenter-8-u1/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org 2023-06-01, VMware vSphere 8.0U1a …

ZSTD 解压缩前端处理方案(干货简单)

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 1.需求描述 由于后台返回数据量大&#xff0c;请求资源比较耗时&#xff0c;需要一个方案来优化性能,下图是一个后台返回一个二进制的文件&#xff0c;需要解析成我们想要的对象 2.使用场景 采用ZSTD方案&#…