我的编程空间,编程开发者的网络收藏夹
学习永远不晚

详解Pytorch中的tensor数据结构

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

详解Pytorch中的tensor数据结构

torch.Tensor

torch.Tensor 是一种包含单一数据类型元素的多维矩阵,类似于 numpy 的 array
Tensor 可以使用 torch.tensor() 转换 Python 的 list 或序列数据生成,生成的是dtype 默认是 torch.FloatTensor

注意 torch.tensor() 总是拷贝 data。如果你有一个 Tensor data 并且仅仅想改变它的 requires_grad 属性,可用 requires_grad_() 或者 detach() 来避免拷贝。如果你有一个 numpy 数组并且想避免拷贝,请使用 torch.as_tensor()

1,指定数据类型的 Tensor 可以通过传递参数 torch.dtype 和/或者 torch.device 到构造函数生成:

注意为了改变已有的 tensor 的 torch.device 和/或者 torch.dtype, 考虑使用 to() 方法.

>>> torch.ones([2,3], dtype=torch.float64, device="cuda:0")
tensor([[1., 1., 1.],
        [1., 1., 1.]], device='cuda:0', dtype=torch.float64)
>>> torch.ones([2,3], dtype=torch.float32)
tensor([[1., 1., 1.],
        [1., 1., 1.]])

2,Tensor 的内容可以通过 Python索引或者切片访问以及修改:

>>> matrix = torch.tensor([[2,3,4],[5,6,7]])
>>> print(matrix[1][2])
tensor(7)
>>> matrix[1][2] = 9
>>> print(matrix)
tensor([[2, 3, 4],
        [5, 6, 9]])

3,使用 torch.Tensor.item() 或者 int() 方法从只有一个值的 Tensor中获取 Python Number:

>>> x = torch.tensor([[4.5]])
>>> x
tensor([[4.5000]])
>>> x.item()
4.5
>>> int(x)
4

4,Tensor可以通过参数 requires_grad=True 创建, 这样 torch.autograd 会记录相关的运算实现自动求导:

>>> x = torch.tensor([[1., -1.], [1., 1.]], requires_grad=True)
>>> out = x.pow(2).sum()
>>> out.backward()
>>> x.grad
tensor([[ 2.0000, -2.0000],
 [ 2.0000,  2.0000]])

5,每一个 tensor都有一个相应的 torch.Storage 保存其数据。tensor 类提供了一个多维的、strided 视图, 并定义了数值操作。

Tensor 数据类型

Torch 定义了七种 CPU tensor 类型和八种 GPU tensor 类型:

tensor数据类型

torch.Tensor 是默认的 tensor 类型(torch.FloatTensor)的简称,即 32 位浮点数数据类型。

Tensor 的属性

Tensor 有很多属性,包括数据类型、Tensor 的维度、Tensor 的尺寸。

  • 数据类型:可通过改变 torch.tensor() 方法的 dtype 参数值,来设定不同的 tensor 数据类型。
  • 维度:不同类型的数据可以用不同维度(dimension)的张量来表示。标量为 0 维张量,向量为 1 维张量,矩阵为 2 维张量。彩色图像有 rgb 三个通道,可以表示为 3 维张量。视频还有时间维,可以表示为 4 维张量,有几个中括号 [ 维度就是几。可使用 dim() 方法 获取 tensor 的维度。
  • 尺寸:可以使用 shape属性或者 size()方法查看张量在每一维的长度,可以使用 view()方法或者reshape() 方法改变张量的尺寸。

样例代码如下:

matrix = torch.tensor([[[1,2,3,4],[5,6,7,8]],
                       [[5,4,6,7], [5,6,8,9]]], dtype = torch.float64)
print(matrix)               # 打印 tensor
print(matrix.dtype)     # 打印 tensor 数据类型
print(matrix.dim())     # 打印 tensor 维度
print(matrix.size())     # 打印 tensor 尺寸
print(matrix.shape)    # 打印 tensor 尺寸
matrix2 = matrix.view(4, 2, 2) # 改变 tensor 尺寸
print(matrix2)

程序输出结果如下:

tensor属性

view 和 reshape 的区别

两个方法都是用来改变 tensor 的 shape,view() 只适合对满足连续性条件(contiguous)的 tensor 进行操作,而 reshape() 同时还可以对不满足连续性条件的 tensor 进行操作。在满足 tensor 连续性条件(contiguous)时,a.reshape() 返回的结果与a.view() 相同,都不会开辟新内存空间;不满足 contiguous 时, 直接使用 view() 方法会失败,reshape() 依然有用,但是会重新开辟内存空间,不与之前的 tensor 共享内存,即返回的是 ”副本“(等价于先调用 contiguous() 方法再使用 view() 方法)。
更多理解参考这篇文章

Tensor 与 ndarray

1,张量和 numpy 数组。可以用 .numpy() 方法从 Tensor 得到 numpy 数组,也可以用 torch.from_numpy 从 numpy 数组得到Tensor。这两种方法关联的 Tensor 和 numpy 数组是共享数据内存的。可以用张量的 clone方法拷贝张量,中断这种关联。

arr = np.random.rand(4,5)
print(type(arr))
tensor1 = torch.from_numpy(arr)
print(type(tensor1))
arr1 = tensor1.numpy()
print(type(arr1))
"""
<class 'numpy.ndarray'>
<class 'torch.Tensor'>
<class 'numpy.ndarray'>
"""

2,item() 方法和 tolist() 方法可以将张量转换成 Python 数值和数值列表

# item方法和tolist方法可以将张量转换成Python数值和数值列表
scalar = torch.tensor(5)  # 标量
s = scalar.item()
print(s)
print(type(s))

tensor = torch.rand(3,2)  # 矩阵
t = tensor.tolist()
print(t)
print(type(t))
"""
1.0
<class 'float'>
[[0.8211846351623535, 0.20020723342895508], [0.011571824550628662, 0.2906131148338318]]
<class 'list'>
"""

创建 Tensor

创建 tensor ,可以传入数据或者维度,torch.tensor() 方法只能传入数据,torch.Tensor() 方法既可以传入数据也可以传维度,强烈建议 tensor() 传数据,Tensor() 传维度,否则易搞混。

传入维度的方法

方法名方法功能备注
torch.rand(*sizes, out=None) → Tensor返回一个张量,包含了从区间 [0, 1)均匀分布中抽取的一组随机数。张量的形状由参数sizes定义。推荐
torch.randn(*sizes, out=None) → Tensor返回一个张量,包含了从标准正态分布(均值为0,方差为1,即高斯白噪声)中抽取的一组随机数。张量的形状由参数sizes定义。不推荐
torch.normal(means, std, out=None) → Tensor返回一个张量,包含了从指定均值 means 和标准差 std 的离散正态分布中抽取的一组随机数。标准差 std 是一个张量,包含每个输出元素相关的正态分布标准差。多种形式,建议看源码
torch.rand_like(a)根据数据 a 的 shape 来生成随机数据不常用
torch.randint(low=0, high, size)生成指定范围(low, hight)和 size 的随机整数数据常用
torch.full([2, 2], 4)生成给定维度,全部数据相等的数据不常用
torch.arange(start=0, end, step=1, *, out=None)生成指定间隔的数据易用常用
torch.ones(*size, *, out=None)生成给定 size 且值全为1 的矩阵数据简单
zeros()/zeros_like()/eye()0 的 tensor 和 对角矩阵简单

样例代码:

>>> torch.rand([1,1,3,3])
tensor([[[[0.3005, 0.6891, 0.4628],
          [0.4808, 0.8968, 0.5237],
          [0.4417, 0.2479, 0.0175]]]])
>>> torch.normal(2, 3, size=(1, 4))
tensor([[3.6851, 3.2853, 1.8538, 3.5181]])
>>> torch.full([2, 2], 4)
tensor([[4, 4],
        [4, 4]])
>>> torch.arange(0,10,2)
tensor([0, 2, 4, 6, 8])
>>> torch.eye(3,3)
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 0., 1.]])

参考资料

PyTorch:view() 与 reshape() 区别

详解torch.rand和torch.randn和torch.normal和linespace()

到此这篇关于Pytorch中的tensor数据结构的文章就介绍到这了,更多相关Pytorch tensor数据结构内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

详解Pytorch中的tensor数据结构

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JS数据结构与算法中的队列结构详解

队列指的是一种受限的线性表,先进先出,今天通过本文带领大家认识队列及队列的应用,对JS数据结构与算法-队列结构相关知识感兴趣的朋友一起看看吧
2022-11-13

Zookeeper 数据结构详解

Zookeeperhttps://zookeeper.apache.org/doc/current/zookeeperOver.htmlZooKeeper is a distributed, open-source coordination service f
Zookeeper 数据结构详解
2016-10-29

JS数据结构之队列结构详解

这篇文章主要为大家详细介绍了JavaScript数据结构与算法中的队列结构,文中通过简单的示例介绍了队列结构的原理与实现,需要的可以参考一下
2022-11-13

Redis中的3种特殊数据结构详解

本文详细介绍了Redis中的3种特殊数据结构:哈希表:以键值对形式存储数据,支持快速查找和任意类型键值。列表:有序线性结构,支持双端插入和删除,访问效率高。集合:无序结构,存储唯一元素,具备快速成员资格检查和集合操作等优点。
Redis中的3种特殊数据结构详解
2024-04-02

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录