Pytorch创建张量的四种方法
作者:ting_qifengl 发布时间:2023-11-20 15:25:36
一、Pytorch创建张量的4种方法
Pytorch创建张量的4种方法主要有:torch.Tensor()、torch.tensor()、torch.as_tensor()、torch.from_numpy()。具体使用方法如下方代码。其中torch.Tensor()是类构造函数,其余三种为工厂函数。工厂函数是指接受参数输入并返回特定类型对象的函数,其允许更多的动态对象创建,有更多的配置参数。通常情况下更倾向于选择工厂函数。
import torch
import numpy as np
t = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(torch.Tensor(t)) # 类构造函数
print(torch.tensor(t)) # 工厂函数
print(torch.as_tensor(t)) # 工厂函数
print(torch.from_numpy(t)) # 工厂函数
输出结果如下:
tensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=torch.int32)
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=torch.int32)
tensor([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]], dtype=torch.int32)
二、4种方法的区别
1、数据类型
import torch
import numpy as np
data = np.array([1,2,3])
t1 = torch.Tensor(data)
print(t1)
print(t1.dtype)
t2 = torch.tensor(data)
print(t2)
print(t2.dtype)
t3 = torch.as_tensor(data)
print(t3)
print(t3.dtype)
t4 = torch.from_numpy(data)
print(t4)
print(t4.dtype)
输出结果如下:
tensor([1., 2., 3.])
torch.float32
tensor([1, 2, 3], dtype=torch.int32)
torch.int32
tensor([1, 2, 3], dtype=torch.int32)
torch.int32
tensor([1, 2, 3], dtype=torch.int32)
torch.int32
可以看出,构造函数torch.Tensor()输出的数据类型与其它三种方法不同,其主要原因是:构造函数在构造一个张量时使用全局缺省值,而工厂函数通过输入数据的类型来推断输出数据的类型。我们可以使用如下代码查看全局缺省值的数据类型。
d = torch.get_default_dtype()
print(d)
输出结果为:
torch.float32
所以,构造函数torch.Tensor()输出的数据类型为torch.float32。而工厂函数可以显示指定数据类型,如下所示。
t = torch.tensor(np.array([1,2,3]), dtype=torch.float64)
print(t)
输出结果为:
tensor([1., 2., 3.], dtype=torch.float64)
2、数据内存分配方式
import torch
import numpy as np
data = np.array([1,2,3])
print(data)
t1 = torch.Tensor(data)
t2 = torch.tensor(data)
t3 = torch.as_tensor(data)
t4 = torch.from_numpy(data)
data[0] = 0
data[1] = 0
data[2] = 0
# t1 和 t2 输出的都是更改前的数组
print(t1)
print(t2)
# t3 和 t4 输出的都是更改后的数组
print(t3)
print(t4)
输出结果为:
[1 2 3]
tensor([1., 2., 3.])
tensor([1, 2, 3], dtype=torch.int32)
tensor([0, 0, 0], dtype=torch.int32)
tensor([0, 0, 0], dtype=torch.int32)
上述差异是由创建时分配内存的方式造成的:torch.Tensor()和torch.tensor()的方式是将数组中的元素值直接拷贝到张量中,改变data中的元素值并不会影响到t1和t2中的值;torch.as_tensor()和torch.from_numpy()的方式是与data数组共享数据。(可将t1和t2的方式看作"值传递";t3和t4的方式看作“地址传递”)。数据共享比数据拷贝更高效,更节省内存空间。
共享数据 | 拷贝数据 |
torch.as_tensor() | torch.tensor() |
torch.from_numpy() | torch.Tensor() |
三、最优的数据转换方法
1、数据拷贝方式的最优选择是 torch.tensor() (因为是工厂函数);
2、内存共享方式的最优选择是 torch.as_tensor() (因为torch.as_tensor可以接受任何python数据结构;而torch.from_numpy只接受numpy数组);
3、数据拷贝的方式更注重实现;而内存共享的方式更注重代码性能,日常使用时不注重性能的话选择torch.tensor()即可。
四、使用内存共享函数的注意事项
1、由于numpy.ndaaray对象分配在CPU上,所以如果使用GPU的话,torch.as_tensor函数必须把数据从CPU上拷到GPU上;
2.、as_tensor()对于python内置的数据结构,如列表,是无效的;
3、as_tensor的调用要求熟悉共享特征,以免对底层数据做不必要的更改,而影响到对象;
4、当as_tensor和numpy.ndarray有大量的相互往返的操作时,对性能的提升会有较大的影响。
来源:https://blog.csdn.net/ting_qifengl/article/details/130577861


猜你喜欢
- vue-cli使用stimulsoft.reports.js(保姆级教程)第一部分:数据源准备以下是JSON数据的教程json数据结构{&q
- 在项目文件中新建文件.env .env.pro 两个文件其中.env 是默认设置 .env.pro 为正式环境设置1、设置.env中的内容信
- Pillow图像降噪处理由于成像设备、传输媒介等因素的影响,图像总会或多或少的存在一些不必要的干扰信息,我们将这些干扰信息统称为&l
- 本文实例讲述了js实现兼容性好的微软官网导航下拉菜单效果。分享给大家供大家参考。具体如下:这是一款微软官网导航菜单,兼容好的下拉菜单,微软官
- 本文实例讲述了python函数装饰器之带参数的函数和带参数的装饰器用法。分享给大家供大家参考,具体如下:1. 函数带多个参数# 普通的装饰器
- Python 语言的优势在于其功能强大,可以用于网络数据采集、数据分析等各种应用场景。本篇文章将介绍如何使用 Python 获取网络数据、使
- 一、json_encode() 对变量进行JSON编码语法:json_encode($value[,$options=0])注意: 
- 大家好,本文将分享如何使用matplotlib制作动态条形图,制作的图很美,这个是我在之前发布的一篇中使用的图片,效果如下制作思路为了方便大
- 由于本人使用的是windows 10 操作系统,所以介绍在 windows 10 系统中安装 Anaconda3 的过程。下载Anacond
- 本文实例为大家分享了python opencv摄像头应用的具体代码,供大家参考,具体内容如下1、安装下载安装包pip install ope
- 安装cuda更新nvidia驱动打开GeForce Game Ready Driver或在GeForce Experience中下载符合自己
- 大多数程序员考虑编程时,他们都要设想用于编写应用程序的 命令式样式和技术。最受欢迎的通用编程语言(包括 Python 和其它面向对象的语言)
- 循环是我们经常用到的一个概念,比如,循环计算数字叠加、循环输出文字内容等。循环是运行重复内容的一个最简单的方法,简化了代码流程,增加了时效性
- 昨天同事无意又谈起了这个老话题,美工和设计师(视觉)有什么不同?以文字排版设计为例,列了下面两个图来说明,可能会有一些启发, 第一个图应该算
- 在上次的爬虫中,抓取的数据主要用到的是第三方的Beautifulsoup库,然后对每一个具体的数据在网页中的selecter来找到它,每一个
- 多数应用场景下,我们需要对重要数据进行备份、并放置到一个安全的地方,以备不时之需。常见的 MySQL 数据备份方式有,直接打包复制对应的数据
- 实现原理PS的扩散效果可以产生类似毛玻璃质感的效果,使画面有些毛毛的感觉。其实现可通过操作像素三通道数值的方式实现,定义一个随机数器,将图像
- 在一个Web App中,所有数据,包括用户信息、发布的日志、评论等,都存储在数据库中。在awesome-python-app中,我们选择My
- 现在要解决的问题如下:我们有一个数据的表第7列有许多数字,并且是用逗号分隔的,数字又有一个对应的关系:我们要得到第7列对应关系的统计,就是每
- 1、一般CentOS默认安装了mariadb,所以先查看是否安装mariadb,如果安装就需要先卸载mariadbrpm -qa|grep