PyTorch中torch.tensor与torch.Tensor的区别详解


Posted in Python onMay 18, 2020

 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丰富。大家可以在练习中多多总结,逐渐提高~

到此这篇关于PyTorch中torch.tensor与torch.Tensor的区别详解的文章就介绍到这了,更多相关PyTorch中torch.tensor与torch.Tensor内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python转换HTML到Text纯文本的方法
Jan 15 Python
浅谈python 四种数值类型(int,long,float,complex)
Jun 08 Python
浅谈对yield的初步理解
May 29 Python
Django压缩静态文件的实现方法详析
Aug 26 Python
Python3使用Matplotlib 绘制精美的数学函数图形
Apr 11 Python
如何用Python破解wifi密码过程详解
Jul 12 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
Aug 23 Python
Django 允许局域网中的机器访问你的主机操作
May 13 Python
基于python实现监听Rabbitmq系统日志代码示例
Nov 28 Python
如何利用python生成MD5并去重
Dec 07 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
Feb 26 Python
仅用几行Python代码就能复制她的U盘文件?
Jun 26 Python
django queryset相加和筛选教程
May 18 #Python
python中JWT用户认证的实现
May 18 #Python
python 实现读取csv数据,分类求和 再写进 csv
May 18 #Python
python 实现分组求和与分组累加求和代码
May 18 #Python
Django ORM实现按天获取数据去重求和例子
May 18 #Python
如何实现更换Jupyter Notebook内核Python版本
May 18 #Python
python mysql自增字段AUTO_INCREMENT值的修改方式
May 18 #Python
You might like
php4的session功能评述(二)
2006/10/09 PHP
最新制作ThinkPHP3.2.3完全开发手册
2015/11/23 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
新手常遇到的一些jquery问题整理
2010/08/16 Javascript
javascript修改表格背景色实例代码分享
2013/12/10 Javascript
JavaScript中string对象
2015/06/12 Javascript
javascript数组克隆简单实现方法
2015/12/16 Javascript
3种不同的ContextMenu右键菜单实现代码
2016/11/03 Javascript
AngularJS过滤器filter用法分析
2016/12/11 Javascript
树结构之JavaScript
2017/01/24 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
Bootstrap下拉菜单更改为悬停(hover)触发的方法
2017/05/24 Javascript
JavaScript表单即时验证 验证不成功不能提交
2017/08/31 Javascript
node通过express搭建自己的服务器
2017/09/30 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
浅谈gulp创建完整的项目流程
2017/12/20 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
微信小程序实现手指拖动选项排序
2020/04/22 Javascript
[43:33]EG vs Spirit Supermajor 败者组 BO3 第一场 6.4
2018/06/05 DOTA
python利用dlib获取人脸的68个landmark
2019/11/27 Python
python rsa-oaep加密的示例代码
2020/09/23 Python
拾金不昧的表扬信
2014/01/16 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
环保标语口号
2014/06/13 职场文书
班级学习雷锋活动总结
2014/07/04 职场文书
代理人委托书
2014/08/01 职场文书
县委常委班子专题民主生活会查摆问题及整改措施
2014/09/27 职场文书
毕业生自荐材料范文
2014/12/30 职场文书
2015年敬老院工作总结
2015/05/18 职场文书
国富论读书笔记
2015/06/26 职场文书
导游经典开场白——导游词
2019/04/17 职场文书
Python爬虫进阶之Beautiful Soup库详解
2021/04/29 Python
golang 实现Location跳转方式
2021/05/02 Golang
pycharm部署django项目到云服务器的详细流程
2021/06/29 Python