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使用clear方法清除字典内全部数据实例
Jul 11 Python
用Python解决计数原理问题的方法
Aug 04 Python
Python生成器定义与简单用法实例分析
Apr 30 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
Aug 04 Python
pandas 条件搜索返回列表的方法
Oct 30 Python
基于wxPython的GUI实现输入对话框(2)
Feb 27 Python
Python基础之条件控制操作示例【if语句】
Mar 23 Python
python 动态绘制爱心的示例
Sep 27 Python
python 常见的反爬虫策略
Sep 27 Python
详解pycharm连接远程linux服务器的虚拟环境的方法
Nov 13 Python
Python hashlib和hmac模块使用方法解析
Dec 08 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
4种Windows系统下Laravel框架的开发环境安装及部署方法详解
2020/04/06 PHP
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
基于jquery的分页控件(C#)
2011/01/06 Javascript
js判断上传文件的类型和大小示例代码
2013/10/18 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
DOM基础教程之使用DOM控制表单
2015/01/20 Javascript
JS获取和修改元素样式的实例代码
2016/08/06 Javascript
D3.js实现文本的换行详解
2016/10/14 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
深入理解nodejs中Express的中间件
2017/05/19 NodeJs
详解angularjs利用ui-route异步加载组件
2017/05/21 Javascript
浅谈webpack打包之后的文件过大的解决方法
2018/03/07 Javascript
在Vue methods中调用filters里的过滤器实例
2018/08/30 Javascript
this在vue和小程序中的使用详解
2019/01/28 Javascript
js屏蔽退格键(backspace或者叫后退键与F5)
2019/02/10 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
[37:37]DAC2018 4.4 淘汰赛 Optic vs Mineski 第二场
2018/04/05 DOTA
python字符串编码识别模块chardet简单应用
2015/06/15 Python
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
django session完成状态保持的方法
2018/11/27 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
Django框架模板语言实例小结【变量,标签,过滤器,继承,html转义】
2019/05/23 Python
python交易记录链的实现过程详解
2019/07/03 Python
Python实现剪刀石头布小游戏(与电脑对战)
2019/12/31 Python
vscode+PyQt5安装详解步骤
2020/08/12 Python
python 绘制国旗的示例
2020/09/27 Python
Matplotlib animation模块实现动态图
2021/02/25 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
关于廉洁的广播稿
2014/01/30 职场文书
事业单位个人查摆问题及整改措施
2014/10/28 职场文书
放飞理想主题班会
2015/08/14 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
Python爬虫基础初探selenium
2021/05/31 Python
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL