【PyTorch】第一节:张量(Tensor)的定义

news2024/11/8 15:10:29

作者🕵️‍♂️:让机器理解语言か

专栏🎇:PyTorch

描述🎨:PyTorch 是一个基于 Torch 的 Python 开源机器学习库。

寄语💓:🐾没有白走的路,每一步都算数!🐾 

张量(Tensor)介绍

        PyTorch 中的所有操作都是在张量的基础上进行的,本实验主要讲解了张量定义和相关张量操作以及 GPU 和张量之间的关系,为以后使用 PyTorch 进行深度学习打下坚实的基础。

知识点🍉

  • 🍓张量的创建
  • 🍓张量的运算(加减乘除)
  • 🍓自动计算梯度 
  • 🍓张量的切片
  • 🍓张量的重塑
  • 🍓NumPy 与 Tensor的转换
  • 🍓GPU 上创建张量

张量:Tensor

什么是张量?

        PyTorch 中的所有内容都基于 Tensor(张量) 操作的。张量可以具有不同的尺寸,它可以是 1 维(标量),2 维(矢量),甚至 3 维(矩阵)或更高。

特点:

  • 比 NumPy 更灵活,可以使用 GPU 的强大计算能力。
  • 开源高效的深度学习研究平台。

张量的创建 

让我们看一下如何在 PyTorch 中创建张量。 

  • 🍅torch.empty( ):创建一个未初始化的tensor

下面,我们创建一个 2×3矩阵。使用 torch.empty 可以返回填充了未初始化数据的张量。张量的形状由可变参数大小定义。 

import torch
torch.empty(2,3)
# 或者 torch.empty(2,3,out = result);print(result) # torch创建张量的每一个函数都有参数out:提供输出 Tensor 作为参数
'''
tensor([[1.1692e-19, 1.5637e-01, 5.0783e+31],
        [4.2964e+24, 2.6908e+20, 2.7490e+20]])
'''
  • 🍅torch.rand(size):随机初始化值在 0-1 之间的tensor(服从均匀分布)

# torch.rand(size)
torch.rand(5, 3)  # 初始化 5*3 大小的 0-1 之间的张量

​ 

  • 🍅torch.zeros(size) /torch.ones(size):初始化全为 1 /全为 0 的tensor

x = torch.zeros(5, 3)
y = torch.ones(5, 3)
print(x)
print(y)

​ 

  • 🍅torch.tensor(list):创建指定值的tensor

创建 Tensor 并使用现有数据初始化,list 可以为 NumPy 中的一个列表。

#创建的张量中的值为 [5.5,3]
x = torch.tensor([5.5, 3])
print(x)
print(x.size())

​ 

  • 🍅x.new_ones( ) :根据现有张量创建新张量

new_ones(size, dtype=None, device=None, requires_grad=False) → Tensor 

  • 返回一个与size大小相同的用1填充的张量。
  • 默认情况下,返回的Tensor具有与此张量相同的torch.dtypetorch.device,除非设置新的值进行覆盖。 
x = x.new_ones(5, 3, dtype=torch.double)  # new_* 方法来创建对象
x

  • 🍅 torch.randn_like( ):生成一个与输入张量形状相同的张量

torch.randn_like()函数的作用是生成一个与输入张量形状相同的张量,其中的元素是标准正态分布中随机采样得到的。 

torch.randn_like(input, dtype=None, layout=None, device=None, requires_grad=False)

  • 其中,input是输入张量dtype是输出张量的数据类型,layout是输出张量的布局,device是输出张量的设备,requires_grad表示是否需要计算梯度。默认情况下,返回的Tensor具有与此张量相同的torch.dtypelayoutdevicerequires_grad。
x = torch.randn_like(x, dtype=torch.float)
x

  

查看张量的大小  x.size()

x.size()
# torch.Size([5, 3])
# 传入的参数为想创建的张量大小
x = torch.empty(1)  # scalar,大小为 1*1 的张量
print(x.size())
x = torch.empty(3)  # vector, 1D,大小为 1*3 的张量
print(x.size())
x = torch.empty(2, 3)  # matrix, 2D,大小为 2*3 的张量
print(x.size())
x = torch.empty(2, 2, 3)  # tensor, 3D,大小为 2*2*3 的张量
print(x.size())

 

📌小贴士

torch.Size 返回值是 tuple 类型,所以它支持 tuple 类型的所有操作。

查看 张量中值的类型 x.dtype( )

x.dtype
# torch.float32

当然,也可以在初始化时传入 dtype 参数,指定数组值的类型

x = torch.zeros(5, 3, dtype=torch.float16)
print(x)

# check type
print(x.dtype)

​  

自动计算梯度 

       如果想要定义的张量能够自动计算梯度(这里先简单说明,详细请查看我的另一篇博客【PyTorch】第二节:梯度的求解),那么我们就需要将参数 requires_grad 置为 True

torch.tensor([5.5, 3], requires_grad=True)
# tensor([5.5000, 3.0000], requires_grad=True)

张量的运算

  • 🥕张量的加法

y = torch.rand(2, 2)
x = torch.rand(2, 2)
# 两种方法:
z1 = x + y
z2 = torch.add(x, y)
z1,z2

​  

还有一种原地相加的操作,相当于y += x或者y = y + x。 

y.add_(x)  # 将 x 加到 y
y

 

📌小贴士:

任何以下划线结尾的操作都会用结果替换原变量。例如:x.copy_(y)x.t_(), 都会改变 x

  • 🥕 张量的减法

# 使用 - 或者 .sub 都可以表示张量减法
z = x - y
z = torch.sub(x, y)
print(z)

​  

  • 🥕张量乘法

# 张量乘法(利用 * 或者 torch.mul表示)
z = x * y
z = torch.mul(x, y)
print(z)

​  

  • 🥕张量除法

# 张量除法(使用 / 或者 torch.div 表示)
z = x / y
z = torch.div(x, y)
print(z)

​  

 张量的切片

和 NumPy 的切片类似,如下:

💡 第一个值表示第一维(即行号),第二个值表示第二维(即列号) 

x = torch.rand(5, 3)
print(x)
print(x[1, 1])  
print(x[:, 0])  # 所有的行中的第 1 列
print(x[1, :])  # 第 2 行中所有的列

​ 

 张量的重塑

       重塑的意思就是将原张量的形状进行变换,即元素总个数不变的情况下改变行数和列数,使用 torch.view(size) 类似于 numpy.reshape

x = torch.randn(4, 4)
y = x.view(16)  # 指定改变后的大小
z = x.view(2, 8)  # 等价于z = x.view(-1, 8) # size -1 从其他维度推断
print(x.size(), y.size(), z.size())
# torch.Size([4, 4]) torch.Size([16]) torch.Size([2, 8])

       当 x 的大小为 12×23×32 ,而我们想把 x 转为 2×m 的大小时,我们就必须手动算出 12×23×32 的值,然后除以 2,进而得到 m 的值。为了避免这种情况,我们可以将 m 所在位置赋为 -1,即y = x.view(2, -1) 表示该维度由从其他维度推断得到。计算机看到 -1 时,会自动使用 12×23×32÷2 的值来替换 -1:

x = torch.randn(12, 23, 32)
y = x.view(2, -1)  # 将需要计算的那个维度直接用 -1 表示 12*23*32/2 的值
x.size(), y.size()
# (torch.Size([12, 23, 32]), torch.Size([2, 4416]))

📌小贴士:

        一次切片中只能有一个位置值为 -1

NumPy 与 Tensor的转换

       将 PyTorch 张量转换为 NumPy 数组(反之亦然)是一件轻而易举的事。PyTorch 张量和 NumPy 数组将共享其底层内存位置,改变一个也将改变另一个。 

  • 🍌tensor.numpy( ) :将 Tensor 类型的变量转为 NumPy 类型

a = torch.ones(5)
print(a)

b = a.numpy()
print(b)
print(type(b))

​ 

  • 🍌 torch.from_numpy( ) :将 NumPy 类型的变量转为 Tensor

import numpy as np
a = np.ones(5)
b = torch.from_numpy(a)
print(a)
print(b)

​ 

了解 NumPy 数组的值如何变化: 

a.add_(1)
a, b
# (tensor([2., 2., 2., 2., 2.]), array([2., 2., 2., 2., 2.], dtype=float32)) 

        可以看出,  NumPy 类型的变量和 Tensor之间的转换其实是一种深复制,改变一个也将改变另一个。

GPU 上创建张量

       默认情况下,所有的张量都是在 CPU 上创建的,但是你也可以使用 GPU 创建它,或者将 CPU 创建的向量移动到 GPU 中

        当然,下面代码只有在你的电脑支持 GPU 的情况下才过下才能运行。我们可以通过torch.cuda.is_available() 命令,查看本地环境时候支持 GPU :

torch.cuda.is_available()
# True 表示支持
# False 表示不支持

将变量放到 GPU 中运行的方式有两种,如下:

  • 🥕在定义时就指定参数 device

      # 如果支持 GPU 则传入字符串 cuda,否则传入 cpu
      device = torch.device("cuda")         
      y = torch.ones_like(x, device=device)  # 在 GPU 上直接创建张量
    
  • 🥕创建张量后,使用 .to 方法将变量移动到 GPU 中

      x = torch.randn(4, 4)
      device = torch.device("cuda")           
      x = x.to(device)                       # 将张量移动到 GPU
    

CUDA 张量

        CUDA 张量是能够在 GPU 设备中运算的张量

# is_available 函数判断是否有 GPU 可以使用
if torch.cuda.is_available():
    device = torch.device("cuda")          # torch.device 将张量移动到指定的设备中
    y = torch.ones_like(x, device=device)  # 直接从 GPU 创建张量
    x = x.to(device)                       # 或者直接使用 .to("cuda") 将张量移动到 cuda 中
    z = x + y
    print(z)
    print(z.to("cpu", torch.double))       # .to 也会对变量的类型做更改
# tensor([1.4566], device='cuda:0')
# tensor([1.4566], dtype=torch.float64)

如果未配置 GPU,那么上述代码没有输出结果。

实验总结

       本实验主要讲解了张量的定义,以及如何使用 PyTorch 完成张量的加、减、乘、除、切片和重塑等操作。在实验的最后,我们对张量进行了扩展,阐述了如何查看本地环境是否支持 GPU ,以及如何将变量定义到 GPU 之中。

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

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

相关文章

云原生网络之微隔离

本博客地址:https://security.blog.csdn.net/article/details/130044619 一、微隔离介绍 1.1、微隔离概念 在主体执行动作时,对主体权限和行为进行判断,最常见的是网络访问控制,也就是零信任网络访问(ZTNA&#xff…

TP5 解决如何实现生成并导出Word文档功能

今天连续更新两篇文章,上一篇讲了一下如何生成PDF并导出文件的功能 接下来我们就来拼一拼怎么实现生成并导出word文档的功能 话不多说 我们直接上流程: 1.下载安装phpword插件:composer require phpoffice/phpword 2.安装成功后该插件在我们项…

Linux——高级I/O操作(三)

目录 I/O多路复用 异步I/O I/O多路复用 阻塞型I/O 相对于非阻塞型 I/O 来说,最大的优点就是在设备的资源不可用时,进程主动放弃 CPU,让其他的进程运行,而不用不停地轮询,有助于提高整个系统的效率。但是其缺点也是比…

Sharding-JDBC之水平分表

目录一、简介1.1、垂直分表1.2、水平分表二、maven依赖三、数据库3.1、创建数据库3.2、创建表四、配置(二选一)4.1、properties配置4.2、yml配置五、实现5.1、实体5.2、持久层5.3、服务层5.4、测试类5.4.1、保存数据5.4.2、查询数据一、简介 1.1、垂直分…

Java入坑之注解和反射

一、注解概念0 1.1基本定义 Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能 1。它们可以用来标记类、方法、变量、参数和包等 简而言之,注解就是对于代码中某些鲜活个体的贴上去的一张…

企业如何开发自己的小程序

小程序是一种轻量级的应用程序,被广泛用于社交娱乐、电商购物等领域。对于企业而言,开发自己的小程序可以为客户提供更加个性化的服务,提高品牌认知度和用户忠诚度。本文将介绍企业如何开发自己的小程序,并通过一个具体的案例来说…

【CSS】图片底部空白缝隙处理 ( 使用居中对齐 / 顶部对齐 / 底部对齐 | 将行内元素 / 行内块元素转为块级元素 )

文章目录一、图片底部空白缝隙问题二、图片底部空白缝隙问题解决方案一 ( 使用居中对齐 / 顶部对齐 / 底部对齐 )三、图片底部空白缝隙问题解决方案二 ( 将行内元素 / 行内块元素转为块级元素 )一、图片底部空白缝隙问题 在上一篇博客中 , 使用默认的基线对齐 , 会发现 行内块级…

java 利用正则来分析日志(IT枫斗者)

利用正则来分析日志(IT枫斗者) 环境接口的历史并发数,然而运维并没有做相关的统计,没办法,只能拿到服务器近一个月的 Nginx access 日志,根据正则匹配所有我的接口服务的日志,然后统计每一秒内…

《低代码PaaS驱动集团企业数字化创新白皮书》-平台化加低代码提供破解之道(2)

平台化加低代码提供破解之道 低代码向业务的赋能:以效率和创新为核心,提升组织效率,促进创新,优化体验 通过IDC对大型企业的调研发现,当前拥有100个及以上应用数量的企业已经高达70%;IDC预测 ,2025年&…

〖Python网络爬虫实战⑮〗- pyquery的使用

订阅:新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列(零基础小白搬砖逆袭) 说明:本专栏持续更新中,目前专栏免费订阅,在转为付费专栏前订阅本专栏的,可以免费订阅付费…

数据结构——队列(C语言实现)

队列的概念与结构 队列是一种特殊的线性结构,数据只能在一端插入,数据也只能在另一端进行删除。插入数据的那一端称之为队尾,插入数据的动作称之为入队。删除数据的那一端称之为队头,删除数据的动作称之为出列。队列遵守的是FIFO…

LeetCode 189.轮转数组

文章目录💡题目分析💡解题思路🚩思路1:暴力求解 --- 旋转k次🔔接口源码:🚩思路2:额外开数组🔔接口源码:🚩思路3:三段逆置📍算法设计🔔接口源码&am…

JavaWeb开发 —— Web入门

目录 一、Spring 二、SpringBootWeb快速入门 三、HTTP协议 1. 概述 2. 请求协议 3. 响应协议 四、Web服务器 - Tomcat 1. 介绍 2. 基本使用 3. 入门程序解析 一、Spring ① 官网:http://spring.io ② Spring 发展到今天已经形成了一种开发生态圈&…

2022 idea 从原型创建maven项目框架--以创建niif-processors为列

目录一、idea配置二、下载archetype-catalog.xml文件三、创建设置四、创建成功截图一、idea配置 在如下两张图片花圈的位置添加如下参数 -Dmaven.wagon.http.ssl.insecuretrue -Dmaven.wagon.http.ssl.allowalltrue -Dmaven.wagon.http.ssl.ignore.validity.datestrue 二、下载…

Qt Quick - 导航控件综述

Qt Quick - 导航控件综述一、概述二、StackView控件三、SwipeView控件四、TabBar控件五、TabButton控件一、概述 Qt Quick Controls提供了一系列导航模型。 控件功能Drawer可以用滑动手势打开和关闭的侧滑动面板StackView提供基于堆栈的导航模型SwipeView允许用户通过横向滑动…

面试官:谈谈你对TypeScript有什么了解

TypeScript 相关面试题1.说说你对 TypeScript 的理解?与 JavaScript 的区别是什么特性区别2.说说你对 TypeScript 中类的理解?应用场景?是什么使用方式继承修饰符私有修饰符受保护修饰符只读修饰符静态属性抽象类应用场景3.说说 typescript 的…

简单易用的公司网页模板,助您快速建站

在当今数字化时代,拥有一个高质量的公司网页是每个企业成功的关键。然而,对于那些没有技术专业知识的人来说,创建一个专业的网页可能是一项艰巨的任务。但是,现在有许多简单易用的公司网页模板可用于帮助您快速建站。 下面&#…

【CSS】文字溢出问题 ( 强制文本在一行中显示 | 隐藏文本的超出部分 | 使用省略号代替文本超出部分 )

文章目录一、文字溢出问题二、文字溢出处理方案三、代码示例一、文字溢出问题 在元素对象内部显示文字 , 如果文本过长 , 则会出现文本溢出的问题 ; 下面的示例中 , 在 150x25 像素的盒子中 , 显示 骐骥一跃,不能十步;驽马十驾,功在不舍; 一段话 , 明显…

【初识C++】(缺省参数和函数重载)

文章目录一、缺省参数1.缺省参数定义2.缺省参数分类2.1全缺省参数2.2半缺省参数二、函数重载1.函数重载概念2.构成重载的几种方式为什么会有函数重载及其原理一、缺省参数 1.缺省参数定义 缺省参数是在函数的声明中给定参数一个指定的值。 如果传参没有给定参数,那…

三百左右蓝牙耳机选哪个?300左右无线蓝牙耳机推荐

多数人消遣的方式一般是听听音乐玩玩游戏,想要更好的体验感最少不了的一定就是蓝牙耳机了,可对于大多数人来说,irpods之类的属实太贵了,所以更多人追求性价比,之前也买过不靠谱的耳机,用几天就坏了&#xf…