PyTorch中torch.tensor与torch.Tensor的区别详解
作者:陈俊超Code My Life 发布时间:2023-03-07 10:48:15
PyTorch最近几年可谓大火。相比于TensorFlow,PyTorch对于Python初学者更为友好,更易上手。
众所周知,numpy作为Python中数据分析的专业第三方库,比Python自带的Math库速度更快。同样的,在PyTorch中,有一个类似于numpy的库,称为Tensor。Tensor自称为神经网络界的numpy。
一、numpy和Tensor二者对比
对比项 | numpy | Tensor |
相同点 | 可以定义多维数组,进行切片、改变维度、数学运算等 | 可以定义多维数组,进行切片、改变维度、数学运算等 |
不同点 | 1、产生的数组类型为numpy.ndarray; 2、会将ndarray放入CPU中进行运算; 3、导入方式为import numpy as np,后续通过np.array([1,2])建立数组; 4、numpy中没有x.type()的用法,只能使用type(x)。 | 1、产生的数组类型为torch.Tensor; 2、会将tensor放入GPU中进行加速运算(如果有GPU); 3、导入方式为import torch,后续通过torch.tensor([1,2])或torch.Tensor([1,2])建立数组; 4、Tensor中查看数组类型既可以使用type(x),也可以使用x.type()。但是更加推荐采用x.type(),具体原因详见下文。 |
举例(以下代码均在Jupyter Notebook上运行且通过):
numpy:
import numpy as np
x = np.array([1,2])
#之所以这么写,是为了告诉大家,在Jupyter Notebook中,是否带有print()函数打印出来的效果是不一样的~
x #array([1, 2])
print(x) #[1 2]
type(x) #numpy.ndarray
print(type(x)) #<class 'numpy.ndarray'>
#注意:numpy中没有x.type()的用法,只能使用type(x)!!!
Tensor:
import torch #注意,这里是import torch,不是import Tensor!!!
x = torch.tensor([1,2])
x #tensor([1, 2])
print(x) #tensor([1, 2]),注意,这里与numpy就不一样了!
type(x) #torch.Tensor
print(type(x)) #<class 'torch.Tensor'>
x.type() #'torch.LongTensor',注意:numpy中不可以这么写,会报错!!!
print(x.type()) #torch.LongTensor,注意:numpy中不可以这么写,会报错!!!
numpy与Tensor在使用上还有其他差别。由于不是本文的重点,故暂不详述。后续可能会更新~
二、torch.tensor与torch.Tensor的区别
细心的读者可能注意到了,通过Tensor建立数组有torch.tensor([1,2])或torch.Tensor([1,2])两种方式。那么,这两种方式有什么区别呢?
(1)torch.tensor是从数据中推断数据类型,而torch.Tensor是torch.empty(会随机产生垃圾数组,详见实例)和torch.tensor之间的一种混合。但是,当传入数据时,torch.Tensor使用全局默认dtype(FloatTensor);
(2)torch.tensor(1)返回一个固定值1,而torch.Tensor(1)返回一个大小为1的张量,它是初始化的随机值。
import torch #注意,这里是import torch,不是import Tensor!!!
x = torch.tensor([1,2])
x #tensor([1, 2])
print(x) #tensor([1, 2]),注意,这里与numpy就不一样了!
type(x) #torch.Tensor
print(type(x)) #<class 'torch.Tensor'>
x.type() #'torch.LongTensor',注意:numpy中不可以这么写,会报错!!!
print(x.type()) #torch.LongTensor,注意:numpy中不可以这么写,会报错!!!
y = torch.Tensor([1,2])
y #tensor([1., 2.]),因为torch.Tensor使用全局默认dtype(FloatTensor)
print(y) #tensor([1., 2.]),因为torch.Tensor使用全局默认dtype(FloatTensor)
type(y) #torch.Tensor
print(type(y)) #<class 'torch.Tensor'>
y.type() #'torch.FloatTensor',注意:这里就与上面不一样了!tensor->LongTensor,Tensor->FloatTensor!!!
print(y.type()) #torch.FloatTensor,注意:这里就与上面不一样了!tensor->LongTensor,Tensor->FloatTensor!!!
z = torch.empty([1,2])
z #随机运行两次,结果不同:tensor([[0., 0.]]),tensor([[1.4013e-45, 0.0000e+00]])
print(z) #随机运行两次,结果不同:tensor([[0., 0.]]),tensor([[1.4013e-45, 0.0000e+00]])
type(z) #torch.Tensor
print(type(z)) #<class 'torch.Tensor'>
z.type() #'torch.FloatTensor',注意:empty()默认为torch.FloatTensor而不是torch.LongTensor
print(z.type()) #torch.FloatTensor,注意:empty()默认为torch.FloatTensor而不是torch.LongTensor
#torch.tensor(1)、torch.Tensor(1)和torch.empty(1)的对比:
t1 = torch.tensor(1)
t2 = torch.Tensor(1)
t3 = torch.empty(1)
t1 #tensor(1)
print(t1) #tensor(1)
type(t1) #torch.Tensor
print(type(t1)) #<class 'torch.Tensor'>
t1.type() #'torch.LongTenso'
print(t1.type()) #torch.LongTensor
t2 #随机运行两次,结果不同:tensor([2.8026e-45]),tensor([0.])
print(t2) #随机运行两次,结果不同:tensor([2.8026e-45]),tensor([0.])
type(t2) #torch.Tensor
print(type(t2)) #<class 'torch.Tensor'>
t2.type() #'torch.FloatTensor'
print(t2.type()) #torch.FloatTensor
t3 #随机运行两次,结果不同:tensor([0.]),tensor([1.4013e-45])
print(t3) #随机运行两次,结果不同:tensor([0.]),tensor([1.4013e-45])
type(t3) #torch.Tensor
print(type(t3)) #<class 'torch.Tensor'>
t3.type() #'torch.FloatTensor'
print(t3.type()) #torch.FloatTensor
上文提到过,对于Tensor,更推荐采用x.type()来查看数据类型。是因为x.type()的输出结果为'torch.LongTensor'或'torch.FloatTensor',可以看出两个数组的种类区别。而采用type(x),则清一色的输出结果都是torch.Tensor,无法体现类型区别。
PyTorch是个神奇的工具,其中的Tensor用法要远比numpy丰富。大家可以在练习中多多总结,逐渐提高~
来源:https://blog.csdn.net/upon120/article/details/106176459
猜你喜欢
- 文本:每行在promotion后面包含一些数字,如果这些数字是相同的,则认为是相同的行,对于相同的行,只保留一行。思路:根据字典和字符串切割
- [Q]怎么样查询特殊字符,如通配符%与_ [Q]如何插入单引号到数据库表中 [Q]怎样设置事务一致性 [Q]怎么样利用光标更新数据 [Q]怎
- 引用是指保存的值为对象的地址。在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心
- openpyxlopenpyxl是⼀个Python库,用于读取/写⼊Excel 2010 xlsx / xlsm / xltx / xltm
- 写在最前面:带你从最简单的二叉树构造开始,深入理解二叉树的数据结构,ps:不会数据结构的程序猿只能是三流的首先,我们构造一个二叉树这是最标准
- 目录结构:contents structure [-]在开始文章之前,先贴上一张Iterable、Iterator与Generator之间的
- 类和实例python是一个面向对象的语言,而面向对象最重要的概念就是类和实例, 记得刚学习的时候不太理解这些概念,直到老师说了一句”物以类聚
- Todo清单需要实现的功能有添加任务、删除任务、编辑任务,操作要关联数据库。任务需要绑定用户,部门。用户需要绑定部门。{#自己编写一个基类模
- 前言本文主要记录python下音频常用的操作,以.wav格式文件为例。其实网上有很多现成的音频工具包,如果仅仅调用,工具包是更方便的。更多p
- 问题:有3扇关闭的门,一扇门后面停着汽车,其余门后是山羊,只有主持人知道每扇门后面是什么。参赛者可以选择一扇门,在开启它之前,主持人会开启另
- 每一字符串字符文字有一个字符集和一个校对规则,它不能为空。一个字符串文字可能有一个可选的字符集引介词和COLLATE子句:[_charset
- 介绍代码地址:https://github.com/taishan1994/chinese_chengyujielong读完该文,你可以收获
- 本文实例讲述了Python实现基于PIL和tesseract的验证码识别功能。分享给大家供大家参考,具体如下:之前搞这个搞了一段时间,后面遇
- 本文实例讲述了python输出指定月份日历的方法。分享给大家供大家参考。具体实现方法如下:#!/usr/bin/pythonimport c
- 如题:在python的函数调用中需要记录时间,下面是记录毫秒时间的方法。import datetimeimport timet1 = dat
- 本文的目的是探讨JS相关技术,并不是以杀毒为主要目的,杀毒只是为讲解一些JS做铺垫的,呵呵,文章有点长,倒杯咖啡或者清茶慢慢看,学习切勿急躁
- Python实现图像处理:PiL依赖库的应用本文包含的练习题主要是PIL依赖库,即pillow相关的应用。练习一:使用python给图片增加
- 近期,我做了一个娱乐门户的投票系统,也是被刷票搞的焦头烂额,一切可用的方法都用了。但都不是太理想,最终,琢磨出来了下面的方法,我做成了流程图
- 掩码数组数据很大形况下是凌乱的,并且含有空白的或者无法处理的字符,掩码式数组可以很好的忽略残缺的或者是无效的数据点。掩码式数组由一个正常数组
- 一、爬虫的流程开始学习爬虫,我们必须了解爬虫的流程框架。在我看来爬虫的流程大概就是三步,即不论我们爬取的是什么数据,总是可以把爬虫的流程归纳