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 相关文章推荐
wxpython中利用线程防止假死的实现方法
Aug 11 Python
跟老齐学Python之集合的关系
Sep 24 Python
为什么Python中没有&quot;a++&quot;这种写法
Nov 27 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
python http基本验证方法
Dec 26 Python
python实现关闭第三方窗口的方法
Jun 28 Python
python脚本当作Linux中的服务启动实现方法
Jun 28 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
Jan 25 Python
Python获取对象属性的几种方式小结
Mar 12 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 Python
python中os.remove()用法及注意事项
Jan 31 Python
python geopandas读取、创建shapefile文件的方法
Jun 29 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
Thinkphp+smarty+uploadify实现无刷新上传
2015/07/30 PHP
PHP中file_get_contents函数抓取https地址出错的解决方法(两种方法)
2015/09/22 PHP
64位windows系统下安装Memcache缓存
2015/12/06 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
Js实现滚动变色的文字效果
2014/06/16 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
2015/03/25 Javascript
简单介绍JavaScript的变量和数据类型
2015/06/03 Javascript
详解JavaScript操作HTML DOM的基本方式
2015/10/21 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
Node.js实现文件上传
2016/07/05 Javascript
浅谈javascript中的加减时间
2016/07/12 Javascript
js手动播放图片实现图片轮播效果
2016/09/17 Javascript
JS实现多级菜单中当前菜单不随页面跳转样式而发生变化
2017/05/30 Javascript
thinkjs 文件上传功能实例代码
2017/11/08 Javascript
vue3.0 CLI - 1 - npm 安装与初始化的入门教程
2018/09/14 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
Python使用os模块和fileinput模块来操作文件目录
2016/01/19 Python
详解python中xlrd包的安装与处理Excel表格
2016/12/16 Python
python中requests小技巧
2017/05/10 Python
python ddt实现数据驱动
2018/03/14 Python
python 实现A*算法的示例代码
2018/08/13 Python
Python 将Matrix、Dict保存到文件的方法
2018/10/30 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
解决django无法访问本地static文件(js,css,img)网页里js,cs都加载不了
2020/04/07 Python
css3的transition效果和transfor效果示例介绍
2013/10/30 HTML / CSS
html5的input的required使用中遇到的问题及解决方法
2018/04/24 HTML / CSS
硕士生找工作求职信
2014/07/05 职场文书
2014年个人总结范文
2015/03/09 职场文书
上课迟到检讨书范文
2015/05/06 职场文书
68句权威创业名言
2019/08/26 职场文书