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]])>>> xtensor([[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.gradtensor([[ 2.0000, -2.0000], [ 2.0000,  2.0000]])

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

Tensor 数据类型

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

Pytorch中的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)               # 打印 tensorprint(matrix.dtype)     # 打印 tensor 数据类型print(matrix.dim())     # 打印 tensor 维度print(matrix.size())     # 打印 tensor 尺寸print(matrix.shape)    # 打印 tensor 尺寸matrix2 = matrix.view(4, 2, 2) # 改变 tensor 尺寸print(matrix2)

程序输出结果如下:

Pytorch中的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中的tensor数据结构实例代码分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Pytorch中的tensor数据结构实例代码分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。

文章标题:Pytorch中的tensor数据结构实例代码分析,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/24906

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年9月14日 上午11:01
下一篇 2022年9月15日 上午1:32

相关推荐

  • windows office365企业版和家庭版区别的是什么

    office365企业版和家庭版区别: 用户数: 1、office家庭版:最多支持 6 位用户。 2、office企业版:最多支持 300 位用户。 许可证: 1、office家庭版:具备家用许可证。 2、office企业版:具备企业许可证。 功能: 1、office企业版相比家庭版,支持更多功能。…

    2022年9月21日
    11400
  • windows驱动精灵安装目录无效请重新指定如何解决

    解决方法: 方法一: 很多情况下是因为从U盘上复制来驱动之后,没有及时将U盘拔掉。 应该及时拔下U盘,再次尝试点击安装。 方法二: 如果安装的驱动与你的系统不匹配也会造成这种原因。 尝试重新下载对应的驱动,再次进行安装。 方法三: 1、进入驱动精灵点击右上角三横。 2、在下拉任务中点击“设置”。 3…

    2022年9月10日
    36000
  • easyrecovery如何恢复回收站数据

    easyrecovery恢复回收站数据的方法 1、进入软件之后,选择你要恢复的数据类型,点击下一步。 2、进入从恢复的界面后,点击“选择位置”,在弹出的文件夹空白处点击鼠标右键, 选择其中的“显示隐藏文件” 3、选择弹出的“Recycle”文件夹,点击扫描。 4、数据扫描完成后,可以点击左侧的“文件…

    2022年9月26日
    5800
  • windows驱动精灵启动鼠标不动如何解决

    驱动精灵启动鼠标不动: 答:这是最新版的驱动精灵的bug。 这样的情况和电脑没有关系,是软件版本更新后造成的bug。 解决方法: 1、启动驱动精灵后,尝试拔出鼠标的USB接口,然后重新插入连接。 鼠标即可继续恢复正常使用。 2、强制重启电脑,重启时拔掉鼠标usb插口。 开机后再次插入连接即可。 驱动…

    2022年9月13日
    7700
  • Redis发布订阅实例分析

    Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 订阅/发布消息图: 第一个对象:消息发送者。第二个对象:频道。第三个对象:消息订阅者。 下图展示了频道 channel1 , 以及订阅这个频道的…

    2022年9月26日
    6000
  • MySQL的碎片有哪些

    MySQL 的几种碎片整理方案总结(解决delete大量数据后空间不释放的问题) 1.背景知识? 1.1 为什么会有碎片? MySQL 中 insert 与 update 都可能导致页分裂,这样就存在碎片。 对于大量的UPDATE,也会产生文件碎片化 , Innodb的最小物理存储分配单位是页(pa…

    2022年9月13日
    11500
  • CDR最新版本的图框精确剪裁位置在哪

    CDR最新版本的图框精确剪裁: 答:在“对象”工具栏下。 1、CDR最新版本将图框精确剪裁改名为“PowerClip”了,所以找不到。 2、我们只需要点击上方“对象”按钮,将鼠标移动到“PowerClip”就可以使用图框精确剪裁了。 3、这是上一代版本的图框精确剪裁,同样在“对象”下,不过是中文所以…

    2022年9月24日
    5400
  • 如何逆向分析Spotify.app并hook其功能获取数据

    项目 该项目的目标是构建一个Spotify客户端,让它能够学习我的听曲习惯并跳过一些我通常会跳过的歌曲。不得不承认,这种需求来自于我的懒惰。我不想在当我有心情想要听某些音乐时,创建或查找播放列表。我希望的是在我的库中选择一首歌,然后可以随机播放其他歌曲,并从队列中删除不“flow(节奏与旋律的流畅)…

    2022年9月8日
    14200
  • vue组件值变化但不刷新问题怎么解决

    今天分享文章“vue组件值变化但不刷新问题怎么解决”,主要从:组件值变化但不刷新强制组件刷新、bug复现、解决等几个方面为大家介绍,希望能帮到您。 组件值变化但不刷新强制组件刷新 在调用组件的时候,如果数据中只是某个属性变化(比如id)变化,在vue开发工具中看到变量值变化,但是组件上的数据就是不刷…

    2022年6月29日
    69400
  • 电脑蓝屏0x00000050如何解决

    解决方法: 方法一: 1、应用程序冲突是最好解决的。 2、首先我们重启电脑,然后在开机时按下键盘“F8”,再选择“疑难解答” 3、接着进入高级选项,在其中找到“启动设置” 4、再按下键盘“F4”,尝试进入安全模式。如果可以进入安全模式应该就是应用程序冲突问题。 5、进入安全模式后,只需要在其中将最近…

    2022年9月18日
    6500
联系我们
关注微信
关注微信
分享本页
返回顶部