【深度学习笔记】彻底理解torch中的tensor与numpy中array区别及用法

这篇具有很好参考价值的文章主要介绍了【深度学习笔记】彻底理解torch中的tensor与numpy中array区别及用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

刚接触深度学习的同学,很多开源项目代码中,张量tensor数组array都有使用,不清楚两者有什么区别,以及怎么使用,如何相互转换等。博主起初也有类似的疑惑,经过查阅资料以及实践,逐渐有了深入了解,本文将记录并分享自己对两者的理解,可供参考。

提示:以下是本篇文章正文内容,下面案例可供参考

一、先搞懂Torch中的tensor与Tensor

torch.Tensor()也就是torch.FloatTensor()的另一种简写,torch.Tensor()会生成**单精度浮点类型(32位)**的张量,如下所示:

#使用torch.FloatTensor()定义一个张量,查看类型
>>> import torch
>>> I = torch.Tensor([2, 3])
tensor([2., 3.])
>>> I.type()
'torch.FloatTensor'
>>>

与torch.Tensor()同级类似的还有torch.IntTensor(),torch.LongTensor(),torch.DoubleTensor(),分别为短整型、长整型、双精度浮点型(64位)。
torch.tensor()中的数据类型决定生成张量的类型,如下所示:

>>> I = torch.tensor([2, 3])
>>> I.type()
'torch.LongTensor'
>>>
>>> I = torch.tensor([1., 2.])
>>> I.type()
'torch.FloatTensor' 
>>>  

可以通过torch.set_default_tensor_type(t)设置默认的tensor类型,如要使用torch.tensor()建立一个双精度浮点类型的张量,如下所示:

>>> torch.set_default_tensor_type(torch.DoubleTensor)  #指定默认类型
>>> torch.tensor([1.2, 3]).dtype  
torch.float64

二、torch.tensor()的用处及数据特点

在深度学习pytorch框架中,torch.tensor是存储和变换数据的重要工具。在torch中,为tensor计算提供了GPU加速、梯度自动求导等功能,这使得深度学习这种拥有庞大计算量的工程提高了计算效率,可以说torch.tensor专为深度学习设计的。

三、np.array()与torch.tensor()比较

numpy产生的数组类型为numpy.ndarray,
1、与torch.tensor()不同,另外打印数组类型的方式也有区别,umpy中没有x.type()的用法,只能使用type(x);
2、numpy.ndarray类型的数据只能放在cpu中计算,而tensor可以放在GPU计算,也可以CPU计算。如下所示:

>>> import numpy as np
>>> A = np.array([[1, 2], [2, 4]])
>>> A
array([[1, 2],
       [2, 4]])
>>> type(A)
<class 'numpy.ndarray'>
>>>

Pytorch中的Tensor又包括CPU上的数据类型和GPU上的数据类型,两种数据类型之间也可以进行相互转换。

三、np.array()与torch.tensor()相互转换

训练时,我们需要先把图像数据读取转换为np.array()类型的数组,然后把np.array()转换为torch.tensor,用于深度学习训练加速。我们使用**numpy()和from_numpy()**将Tensor和NumPy中的数组相互转换。
注意这两个函数所产生的的Tensor和NumPy中的数组共享相同的内存(所以他们之间的转换很快),改变其中一个时另一个也会改变,

还有一个常用的将NumPy中的array转换成Tensor的方法就是torch.tensor(), 
需要注意的是,此方法总是会进行数据拷贝(就会消耗更多的时间和空间),
所以返回的Tensor和原来的数据不再共享内存。

1.使用numpy()将Tensor转换成NumPy数组:

代码如下(示例):

>>> a = torch.ones(5)
>>> a
tensor([1., 1., 1., 1., 1.])
>>> a.type()
'torch.FloatTensor'
>>> b = a.numpy()
>>> b
array([1., 1., 1., 1., 1.], dtype=float32)
>>>

2.使用from_numpy()将NumPy数组转换成Tensor:

代码如下(示例):

>>> a = np.ones(5)
>>> a
array([1., 1., 1., 1., 1.])
>>> type(a)
<class 'numpy.ndarray'>
>>>
>>> b = torch.from_numpy(a)
>>> b
tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
>>>

3.直接使用torch.tensor()将NumPy数组转换成Tensor:

**注意:该方法总是会进行数据拷贝,返回的Tensor和原来的numpy数据不再共享内存。**验证代码如下:

>>> a = np.ones(5)
>>> a
array([1., 1., 1., 1., 1.])
>>> type(a)
<class 'numpy.ndarray'>
>>>
>>> b = torch.from_numpy(a)
>>> b
tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
>>>
>>> c = torch.tensor(a)
>>> c
tensor([1., 1., 1., 1., 1.], dtype=torch.float64)	
>>> a += 1
>>> a
array([2., 2., 2., 2., 2.])				#a的值加1,改变
>>> c
tensor([1., 1., 1., 1., 1.], dtype=torch.float64)  #c的值未变,因为是拷贝,不共享内存
>>> b
tensor([2., 2., 2., 2., 2.], dtype=torch.float64)	#b的值已经改变,与a的值一样,虽然类型不一样
>>>

总结

本文主要记录介绍torch.tensor与numpy.array之间的区别,以及应用场景,相互转换的方法,讲述了更多的细节,这些知识点在深度学习模型训练中非常有用,属于基础知识。博主后续会继续更新分享深度学习笔记,记录提炼知识点,总结学习经验及项目经验。如果本文对您的理解有帮助,请点赞+关注+收藏!文章来源地址https://www.toymoban.com/news/detail-402615.html

到了这里,关于【深度学习笔记】彻底理解torch中的tensor与numpy中array区别及用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 机器学习和深度学习--李宏毅(笔记与个人理解)Day9

    中间打了一天的gta5,图书馆闭馆正好+npy 不舒服那天+天气不好,哈哈哈哈哈总之各种理由吧,导致昨天没弄起来,今天补更! 这里重点注意一下, 这个 output值是概率哈,也就是说式子整体表示的含义是 x 属于c1的概率是多大 这个老师真的是讲到我的心坎子里区了,这个lo

    2024年04月17日
    浏览(30)
  • tensor是pytorch的核心,那torch.tensor和torch.Tensor区别是?

    从本节课程开始我们将正式开启pytorch的学习了,在深度学习框架中有一个重要的概念叫做张量,它是pytorch的基本操作单位,要想创建tensor有很多的方式,但是有两个torch.tensor和torch.Tensor容易混淆,本节课程对二者进行总结。 torch.Tensor是默认的tensor类型(torch.FloatTensor)的简

    2024年04月24日
    浏览(23)
  • 一文理解深度学习中的多尺度和不同感受野(视野)信息

    如何理解深度学习中的多尺度和不同视野信息 在进行图像处理的深度模型中,合理理解并利用不同尺度信息和不同视野信息将对图像结果有意想不到的结果,那么具体什么是多尺度信息,什么是不同视野信息 1.不同尺度信息 多尺度是指不同尺度的信号采样,在不同尺度下可

    2024年02月16日
    浏览(32)
  • 『CV学习笔记』深度理解半精度float16的表示

    『CV学习笔记』深度理解半精度float16的表示 深度学习中 int8、float16、float32 的主要却别在于能表示的 数值范围、数值精度 。 半精度是英伟达在2002年搞出来的,双精度和单精度是为了计算, 而半精度更多是为了降低数据传输和存储成本 。很多场景对于精度要求也没那么高,

    2024年02月03日
    浏览(24)
  • 彻底理解solidity中的事件

    在我之前的几篇关于智能合约的文章中,都有提到事件的用法,比如: 这里定义了两个事件,分别表示最高竞价更新了和拍卖结束了。 然后在需要的位置,调用事件,比如: 我们可以通过emit调用事件方法,然后这个事件就作为日志记录到了以太坊区块链中。日志是以太坊区

    2024年02月02日
    浏览(26)
  • 【深度学习】pytorch——Tensor(张量)详解

    笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ Tensor,又名张量。它可以是一个数(标量)、一维数组(向量)、二维数组(矩阵)和更高维的数组(高阶数据)。Tensor和Numpy的ndarrays类似,但PyTorch的tensor支持GPU加速。 官方文档 : https://pytorch.org/docs/stable/tensors.html

    2024年02月06日
    浏览(31)
  • 【自然语言处理】【深度学习】NLP中的N-gram理解

    N-gram是自然语言处理(NLP)中的一个概念,它描述的是文本中连续的n个项(通常是单词或字符)。这个概念主要用于语言建模和文本分析中。 具体来说: Unigram (1-gram): 包含一个单词的序列,例如句子中的单个单词。 Bigram (2-gram): 包含两个相邻单词的序列。例如,在句子 “

    2024年01月25日
    浏览(37)
  • 彻底理解FreeRTOS中的队列(Queue)

    “队列”(Queue)提供了任务与任务之间通信的机制。在这样的场景:一个或多个其他的任务产生数据,主任务要依次处理数据,队列就显得非常有用了。 参考资料:《Mastering the FreeRTOS Real Time Kernel》-Chapter 4 Queue Management FreeRTOS全解析-5.队列(Queue) 目录 1.队列的特征 1.1数据存

    2024年02月03日
    浏览(27)
  • 深度学习--PyTorch定义Tensor以及索引和切片

    ​这些方法只是开辟了空间,所附的初始值(非常大,非常小,0),后面还需要我们进行数据的存入。 torch.empty():返回一个没有初始化的Tensor,默认是FloatTensor类型。 torch.FloatTensor():返回没有初始化的FloatTensor。 torch.IntTensor():返回没有初始化的IntTensor。 随机均匀分布:

    2023年04月20日
    浏览(32)
  • (Python)对numpy中的argmax用法的理解

    argmax()返回的就是最大数的索引 argmax()有一个参数axis,可以指定函数返回不同维的最大值。 结果是 4 。而在python中一维向量只有一个方向,所以一维情况下axis只能等于0,函数只会返回一个值。 如果对它进行转置,它就会变成一个二维矩阵: axis的值大于0 比如说 会报错 nu

    2023年04月24日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包