深度之眼Pytorch打卡(二):Pytorch张量与张量的创建

2023-12-26 17:18

本文主要是介绍深度之眼Pytorch打卡(二):Pytorch张量与张量的创建,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言


        张量既是Pytorch中的一种基本数据结构,表示多维数组,也是一种自动求梯度的方式。本笔记框架主要来源于深度之眼,并作了一些相关的拓展。内容包括:张量的含义,0维,1维,2维,3维,4维,5维张量的形状;张量的若干参数和自动求梯度的方法;张量的若干常用创建方法。


Pytorch张量


        在各种深度学习框架中,张量(tensor)一般是被定义成多维数组,目的是把向量、矩阵推向更高的维度。张量在Pytorch中,既是基本数据结构,也是自动求梯度的工具。

  • 张量(tensor)

        标量,向量,矩阵等都是张量。其中标量是0维张量,向量是1维张量,矩阵是2维张量。我们通常见到的灰度图像是2维张量,彩色图像是3维张量。由若干三维张量可以构成4维张量,若干4维张量可以构成5维张量,以此类推。如下图所示(改画自博客,这篇博客系统的介绍了张量的各种含义)

                                       

  • Variable

            Variable是 torch.autograd中的数据类型,主要用于封装 Tensor,便于进行自动求导。在Pytorch0.4.0及其之后的版本中,Variable被并入了Tensor里。torch.autograd.Variable包含以下5个属性:

            data:用于存放tensor,是数据本体。

            grad:data的梯度值。

            grad_fn:记录创建张量时所用的方法(函数——乘法:grad_fn = <MulBackward0>,加法:grad_fn = <AddBackward0>),用于反向传播的梯度计算之用。grad_fn指向创建Tensor的函数,如果某一个Tensor是由用户创建的,则指向:None

           requires_grad:指示是否需要梯度,对于需要求导的tensor,其requires_grad属性必须为True,即:requires = Ture.自己定义的tensor的requires_grad属性默认为False,神经网络层中的权值w的tensor的requires_grad属性默认为True。

           is_ leaf : 指示是否是叶子结点(张量),用户创建的结点称为叶子结点(张量),如X 与 W。is_leaf 为False,即:is_leaf = Ture,的时候,则不是叶子节点,,is_leaf为True的时候是叶子节点。叶子节点在经过反向传播之后梯度值能够得以保留,非叶子节点的梯度值则为:None

  • Pytorch张量

            前面已经提到,Pytorch0.4.0及其之后的版本中,Tensor已经包含Variable的内容,所以它理应包含Variable的所有属性。Pytorch张量一共有如下图所示的8个属性,其中5个如上,剩余3个如下:

                                         

            dtype:张量的数据类型,分成浮点,整型和布尔三大类,共9种数据类型,如下表所示(引自pytorch官网),其中32位浮点和64位整型最为常用。图像预处理结果默认:torch.float32,图像标签默认:torch.int64.

数据类型

dtype

CPU张量

GPU张量

32位浮点

torch.float32 or torch.float

torch.FloatTensor

torch.cuda.FloatTensor

64位浮点

torch.float64 or torch.double

torch.DoubleTensor

torch.cuda.DoubleTensor

16位浮点

torch.float16 or torch.half

torch.HalfTensor

torch.cuda.HalfTensor

8位整数(无符号)

torch.uint8

torch.ByteTensor

torch.cuda.ByteTensor

8位整数(有符号)

torch.int8

torch.CharTensor

torch.cuda.CharTensor

16位整数(有符号)

torch.int16 or torch.short

torch.ShortTensor

torch.cuda.ShortTensor

32位整数(有符号)

torch.int32 or torch.int

torch.IntTensor

torch.cuda.IntTensor

64位整数(有符号)

torch.int64 or torch.long

torch.LongTensor

torch.cuda.LongTensor

布尔型

torch.bool

torch.BoolTensor

torch.cuda.BoolTensor

           shape : 张量的形状。如(32,3,448,448)就是一个32*3*448*448的4维张量,相当于32张448*448的RGB图像,堆积方式可以通过上述张量的示意图推出。
          device : 张量所在设备,GPU 或CPU,张量在GPU上才能用其加速。


常用的Pytorch张量创建方式          


  • ★torch.tensor()  

torch.tensor(data, dtype=None, device=None, requires_grad=False, pin_memory=False) 

            data:张量的初始数据。可以是列表,元组,NumPy的n维数组(ndarray),标量和其他类型。 

           dtype:返回张量的数据类型,默认值:None,表示与data数据类型一致。      

           device:返回张量的所需设备。默认值:None,表示使用当前设备。若是CPU张量,则设备是当前CPU,若是cuda张量,则设备是当前GPU。

          requires_grad:是否需要计算梯度,默认False。

          pin_memory:返回的张量是否在固定内存中分配,仅适用于CPU张量,涉及效率问题。默认值:False。

         代码:

# 输入列表,数据类型是int64
a = [[1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
t = torch.tensor(a)
print(t, '\n', t.dtype)

        结果: 

tensor([[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4]]) torch.int64

        代码: 

# 输入列表,数据类型是float32
a = [[1.2, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4], [1, 2, 3, 4]]
t = torch.tensor(a)
print(t, '\n', t.dtype)

       结果: 

tensor([[1.2000, 2.0000, 3.0000, 4.0000],[1.0000, 2.0000, 3.0000, 4.0000],[1.0000, 2.0000, 3.0000, 4.0000],[1.0000, 2.0000, 3.0000, 4.0000]]) torch.float32

        代码:

# 输入一个浮点数
a = 3.1415926535
t = torch.tensor(a, dtype=torch.int64)
print(t, '\n', t.dtype)

        结果:

tensor(3) torch.int64

       代码:

# 输入一个浮点数,设备选择cuda,由于要从cpu先转换到GPU,所以结果输出较慢
a = 3.1415926535
t = torch.tensor(a, dtype=torch.float64, device='cuda')
print(t, '\n', t.dtype)

       结果: 根据cuda编号可以选择不同的GPU

tensor(3.1416, device='cuda:0', dtype=torch.float64) torch.float64
  • torch.from_numpy()

torch.from_numpy(ndarray)

        torch.from_numpy(ndarray)返回的张量和ndarray共享相同的内存,即:对张量的修改将反映在ndarray上,反之亦然。且返回的张量不可调整大小。目前,该函数接受dtypes为numpy.float64, numpy.float32numpy.float16numpy.int64numpy.int32, numpy.int16numpy.int8numpy.uint8numpy.bool的ndarray。

        代码:

a = np.array([1, 2, 3, 4])
t = torch.from_numpy(a)
print(t)
t[0] = 10
print('modify t print a:', a)
a[3] = -5
print('modify a print t:', t)

         结果:印证了共享内存

tensor([1, 2, 3, 4], dtype=torch.int32)
modify t print a: [10  2  3  4]
modify a print t: tensor([10,  2,  3, -5], dtype=torch.int32)
  • ★torch.zeros()

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

        size:张量的形状,是一个整数序列,如(448,448)。

        out:输出张量到out指向的地址

        layout:张量在内存中的布局形式,目前支持 torch.strided(密集张量),并提供实验支持 torch.sparse_coo(稀疏COO张量),默认值:torch.strided,它也是最常用的布局形式。

        代码:

out_t = torch.tensor(3.14)
t = torch.zeros(4, out=out_t)
print(t.dtype)
print('address of t:', id(t), '\n', t)
print('address of out_t:', id(out_t), '\n', out_t)

         结果:值与分配的内存地址均相同,是同一个数据,只是名字不同。默认数据类型,float32

torch.float32
address of t: 2377593164568 tensor([0., 0., 0., 0.])
address of out_t: 2377593164568 tensor([0., 0., 0., 0.])
  • torch.zeros_like()

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

         input:创建与输入张量形状相同的全0张量。

        代码:

a = torch.tensor([1, 2, 3, 4])
t = torch.zeros_like(a)
print('a:', a)
print('t:', t)

        结果:

a: tensor([1, 2, 3, 4])
t: tensor([0, 0, 0, 0])
  • ★torch.ones() 

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

torch.ones_like(input, dtype=None, layout=None, device=None, requires_grad=False)
  • ★torch.empty()

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

         返回填充了未初始化数据的张量。

        代码:

a = torch.empty(4, 2)
print(a)

         结果:

tensor([[1.3563e-19, 4.7393e+30],[1.4312e+13, 1.7753e+28],[1.9208e+31, 4.6114e+24],[3.1036e+27, 7.1941e+28]])
  • torch.empty_like()

torch.empty_like(input,dtype = None,layout = None,device = None,require_grad = False ) 
  • torch.full()

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

         full_value:填充到张量的值,必须是个数

        代码:

a = torch.full((3, 3), 3.14)
print(a)

        结果:

tensor([[3.1400, 3.1400, 3.1400],[3.1400, 3.1400, 3.1400],[3.1400, 3.1400, 3.1400]])
  • torch.full_like() 

torch.full_like(input, fill_value, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)
  • ★ torch.arange()

torch.arange(start=0, end, step=1, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False)

        返回一个大小为下式的一维等差张量

                                                                                     

        startNumber):起始值。默认值:0

        endNumber):结束值

        stepNumber):每对相邻点之间的间隙,即公差。默认值:1

        代码: 

a = torch.arange(2, 10)
print(a)
b = torch.arange(3, 10, 6)
print(b)

        结果: 

tensor([2, 3, 4, 5, 6, 7, 8, 9])
tensor([3, 9])
  • ★torch.linspace()

torch.linspace(start,end,steps = 100,out = None,dtype = None,layout = torch.strided,device = None,require_grad = False )

        创建一个包含在start与end之间的,steps 个等距点值的一维张量。

        startpython:float):起始值

        endpython:float):结束值

       stepspython:intstart 和 end之间要采样的点数。默认值:100

        代码:

a = torch.linspace(1, 10, 8)
print(a)

        结果:间距为(end-start)/(steps-1)

tensor([ 1.0000,  2.2857,  3.5714,  4.8571,  6.1429,  7.4286,  8.7143, 10.0000])
  •  torch.logspace()

        创建一个包含在 之间的,steps 个对数等距点值的一维张量

 

torch.logspace(start,end,steps = 100,base = 10.0,out = None,dtype = None,layout = torch.strided,device = None,require_grad = False )

        basepython:float):–对数函数的底。默认值:10.0

        代码:

a = torch.logspace(1, 10, 8)
print(a)

        结果:

tensor([1.0000e+01, 1.9307e+02, 3.7276e+03, 7.1969e+04, 1.3895e+06, 2.6827e+07,5.1795e+08, 1.0000e+10])
  • torch.eye()

torch.eye(n,m = None,out = None,dtype = None,layout = torch.strided,device = None,require_grad = False )

        创建一个2维对角张量。 若是方阵,只需要设置行数

        n:行数

        m:列数 

        代码:

a = torch.eye(3, 4)
print(a)

        结果:

tensor([[1., 0., 0., 0.],[0., 1., 0., 0.],[0., 0., 1., 0.]])
  •  torch.seed()

        用于将生成随机数的种子设置为不确定的随机数

  • ★torch.normal

torch.normal(mean, std, *, generator=None, out=None)

         从均值为mean,标准差为std的正态分布函数中取样来形成张量。一共有四种模式:

         mean为标量,std为标量:在给定mean和std决定的正态分布中取样特定个数个值形成张量,形成张量的尺寸需要指定,如形成一个(2,1,4)的张量。

        代码:

a = torch.normal(2, 3, size=(2, 2, 4))
print(a)

        结果: 

tensor([[[ 3.4884,  1.9780, -1.2065,  2.6255],[ 0.6016,  5.3134, -0.4075, -0.4173]],[[-2.2090, -1.3162, -0.8148, -1.2134],[-1.3311,  1.8877,  6.2911,  1.7421]]])

        mean为张量,std为标量: 不可设置size,分别在以张量mean的各个元素为均值,标量std为方差,构成的正态分布中取一个值来组成一个张量。张量尺寸与张量mean相同。

        代码:

mean = torch.tensor([[1., 2., 3.],[4., 5., 6.]])
a = torch.normal(mean, 1.)
print(a)

        结果:

tensor([[3.5307, 1.9584, 4.2141],[3.5544, 4.3479, 5.6270]])

         mean为标量,std为张量:与上一个类似。

         mean为张量,std为张量:两个张量必须尺寸一样,元素一一对应。

        代码:

mean = torch.tensor([[1., 2., 3.],[4., 5., 6.]])
std = torch.tensor([[1., 0., 1.],[0., 1., 0.]])
a = torch.normal(mean, std)
print(a)

        结果:

tensor([[0.6861, 2.0000, 5.1926],[4.0000, 5.6284, 6.0000]])
  • torch.rand()

torch.rand(* size,out = None,dtype = None,layout = torch.strided,device = None,require_grad = False )

        生成的张量由区间[0,1)上的均匀分布的随机数填充,张量的形状由变量参数size定义。也有对应的torch.rand_like()

  • torch.randint()

torch.randint(low = 0,high,size,*,generator = None,out = None,dtype = None,layout = torch.strided,device = None,require_grad = False )

      生成的张量由区间[lowhigh]上的均匀分布的随机数填充,张量的形状由变量参数size定义。也有对应的torch.randint_like() 

  • torch.randn()

torch.randn(* size,out = None,dtype = None,layout = torch.strided,device = None,require_grad = False )

         生成的张量由标准正态分布上的随机数填充,张量的形状由变量参数size定义。也有对应的torch.randn_like()

          更多的方法,点击这里。


参考


        https://ai.deepshare.net/detail/p_5df0ad9a09d37_qYqVmt85/6

        https://blog.csdn.net/qq_25948717/article/details/80310020

        https://www.cnblogs.com/henuliulei/p/11363121.html

        https://www.cnblogs.com/hellcat/p/8449031.html

        https://zhuanlan.zhihu.com/p/85506092

这篇关于深度之眼Pytorch打卡(二):Pytorch张量与张量的创建的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/540224

相关文章

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

韦季李输入法_输入法和鼠标的深度融合

在数字化输入的新纪元,传统键盘输入方式正悄然进化。以往,面对实体键盘,我们常需目光游离于屏幕与键盘之间,以确认指尖下的精准位置。而屏幕键盘虽直观可见,却常因占据屏幕空间,迫使我们在操作与视野间做出妥协,频繁调整布局以兼顾输入与界面浏览。 幸而,韦季李输入法的横空出世,彻底颠覆了这一现状。它不仅对输入界面进行了革命性的重构,更巧妙地将鼠标这一传统外设融入其中,开创了一种前所未有的交互体验。 想象

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

免费也能高质量!2024年免费录屏软件深度对比评测

我公司因为客户覆盖面广的原因经常会开远程会议,有时候说的内容比较广需要引用多份的数据,我记录起来有一定难度,所以一般都用录屏工具来记录会议内容。这次我们来一起探索有什么免费录屏工具可以提高我们的工作效率吧。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  录屏软件录屏功能就是本职,这款录屏工具在录屏模式上提供了多种选项,可以选择屏幕录制、窗口

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计