PyTorch中Tensor的拼接与拆分的实现


Posted in Python onAugust 18, 2019

拼接张量:torch.cat() 、torch.stack()

  1. torch.cat(inputs, dimension=0) → Tensor

在给定维度上对输入的张量序列 seq 进行连接操作

举个例子:

>>> import torch
>>> x = torch.randn(2, 3)
>>> x
tensor([[-0.1997, -0.6900, 0.7039],
    [ 0.0268, -1.0140, -2.9764]])
>>> torch.cat((x, x, x), 0) # 在 0 维(纵向)进行拼接
tensor([[-0.1997, -0.6900, 0.7039],
    [ 0.0268, -1.0140, -2.9764],
    [-0.1997, -0.6900, 0.7039],
    [ 0.0268, -1.0140, -2.9764],
    [-0.1997, -0.6900, 0.7039],
    [ 0.0268, -1.0140, -2.9764]])
>>> torch.cat((x, x, x), 1) # 在 1 维(横向)进行拼接
tensor([[-0.1997, -0.6900, 0.7039, -0.1997, -0.6900, 0.7039, -0.1997, -0.6900,
     0.7039],
    [ 0.0268, -1.0140, -2.9764, 0.0268, -1.0140, -2.9764, 0.0268, -1.0140,
     -2.9764]])
>>> y1 = torch.randn(5, 3, 6)
>>> y2 = torch.randn(5, 3, 6)
>>> torch.cat([y1, y2], 2).size()
torch.Size([5, 3, 12])
>>> torch.cat([y1, y2], 1).size()
torch.Size([5, 6, 6])

对于需要拼接的张量,维度数量必须相同,进行拼接的维度的尺寸可以不同,但是其它维度的尺寸必须相同。

  • torch.stack(sequence, dim=0)

沿着一个新维度对输入张量序列进行连接。 序列中所有的张量都应该为相同形状

举个例子:

>>> x1 = torch.randn(2, 3)
>>> x2 = torch.randn(2, 3)
>>> torch.stack((x1, x2), 0).size() # 在 0 维插入一个维度,进行区分拼接
torch.Size([2, 2, 3])
>>> torch.stack((x1, x2), 1).size() # 在 1 维插入一个维度,进行组合拼接
torch.Size([2, 2, 3])
>>> torch.stack((x1, x2), 2).size()
torch.Size([2, 3, 2])
>>> torch.stack((x1, x2), 0)
tensor([[[-0.3499, -0.6124, 1.4332],
     [ 0.1516, -1.5439, -0.1758]],

    [[-0.4678, -1.1430, -0.5279],
     [-0.4917, -0.6504, 2.2512]]])
>>> torch.stack((x1, x2), 1)
tensor([[[-0.3499, -0.6124, 1.4332],
     [-0.4678, -1.1430, -0.5279]],

    [[ 0.1516, -1.5439, -0.1758],
     [-0.4917, -0.6504, 2.2512]]])
>>> torch.stack((x1, x2), 2)
tensor([[[-0.3499, -0.4678],
     [-0.6124, -1.1430],
     [ 1.4332, -0.5279]],

    [[ 0.1516, -0.4917],
     [-1.5439, -0.6504],
     [-0.1758, 2.2512]]])

把相同形状的张量合并,并根据提供的维度序列在相应位置插入维度,方法会根据位置来排列数据。代码中,根据第 0 维和第 1 维来进行合并时,虽然合并后的张量维度和尺寸相等,但是数据的位置并不是相同的。

拆分张量:torch.split()、torch.chunk()

  • torch.split(tensor, split_size, dim=0)

将输入张量分割成相等形状的 chunks(如果可分)。 如果沿指定维的张量形状大小不能被 split_size 整分, 则最后一个分块会小于其它分块。

举个例子:

>>> x = torch.randn(3, 10, 6)
>>> a, b, c = x.split(1, 0) # 在 0 维进行间隔维 1 的拆分
>>> a.size(), b.size(), c.size()
(torch.Size([1, 10, 6]), torch.Size([1, 10, 6]), torch.Size([1, 10, 6]))
>>> d, e = x.split(2, 0) # 在 0 维进行间隔维 2 的拆分
>>> d.size(), e.size()
(torch.Size([2, 10, 6]), torch.Size([1, 10, 6]))

把张量在 0 维度上以间隔 1 来拆分时,其中 x 在 0 维度上的尺寸为 3,就可以分成 3 份。

把张量在 0 维度上以间隔 2 来拆分时,只能分成 2 份,且只能把前面部分先以间隔 2 来拆分,后面不足 2 的部分就直接作为一个分块。

  • torch.chunk(tensor, chunks, dim=0)

在给定维度(轴)上将输入张量进行分块儿

直接用上面的数据来举个例子:

>>> l, m, n = x.chunk(3, 0) # 在 0 维上拆分成 3 份
>>> l.size(), m.size(), n.size()
(torch.Size([1, 10, 6]), torch.Size([1, 10, 6]), torch.Size([1, 10, 6]))
>>> u, v = x.chunk(2, 0) # 在 0 维上拆分成 2 份
>>> u.size(), v.size()
(torch.Size([2, 10, 6]), torch.Size([1, 10, 6]))

把张量在 0 维度上拆分成 3 部分时,因为尺寸正好为 3,所以每个分块的间隔相等,都为 1。

把张量在 0 维度上拆分成 2 部分时,无法平均分配,以上面的结果来看,可以看成是,用 0 维度的尺寸除以需要拆分的份数,把余数作为最后一个分块的间隔大小,再把前面的分块以相同的间隔拆分。

在某一维度上拆分的份数不能比这一维度的尺寸大

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python使用chardet判断字符编码
May 09 Python
JSONLINT:python的json数据验证库实例解析
Nov 28 Python
Python实现简单遗传算法(SGA)
Jan 29 Python
python实现微信发送邮件关闭电脑功能
Feb 22 Python
python判断一个集合是否为另一个集合的子集方法
May 04 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
Aug 31 Python
在Mac下使用python实现简单的目录树展示方法
Nov 01 Python
Python3获取拉勾网招聘信息的方法实例
Apr 03 Python
linux环境中没有网络怎么下载python
Jul 07 Python
python3调用windows dos命令的例子
Aug 14 Python
Pytorch训练过程出现nan的解决方式
Jan 02 Python
利用Python的folium包绘制城市道路图的实现示例
Aug 24 Python
详解PyTorch中Tensor的高阶操作
Aug 18 #Python
浅析PyTorch中nn.Linear的使用
Aug 18 #Python
Pytorch实现GoogLeNet的方法
Aug 18 #Python
PyTorch之图像和Tensor填充的实例
Aug 18 #Python
Pytorch Tensor的索引与切片例子
Aug 18 #Python
在PyTorch中Tensor的查找和筛选例子
Aug 18 #Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 #Python
You might like
第七章 php自定义函数实现代码
2011/12/30 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
2013/01/27 PHP
解密ThinkPHP3.1.2版本之独立分组功能应用
2014/06/19 PHP
什么情况下可以不写PHP的闭合标签“?>”
2014/08/28 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
php去掉文件前几行的方法
2015/07/29 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
2015/08/24 Javascript
json+jQuery实现的无限级树形菜单效果代码
2015/08/27 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
手把手搭建安装基于windows的Vue.js运行环境
2017/06/12 Javascript
微信小程序 数据绑定及运算的简单实例
2017/09/20 Javascript
VueJs使用Amaze ui调整列表和内容页面
2017/11/30 Javascript
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
javascript自定义日期比较函数用法示例
2019/07/22 Javascript
Vue简单实现原理详解
2020/05/07 Javascript
在Python中操作字典之clear()方法的使用
2015/05/21 Python
TensorFlow中权重的随机初始化的方法
2018/02/11 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
python 实时得到cpu和内存的使用情况方法
2018/06/11 Python
Python3解释器知识点总结
2019/02/19 Python
很酷的python表白工具 你喜欢我吗
2019/04/11 Python
将自己的数据集制作成TFRecord格式教程
2020/02/17 Python
Python描述符descriptor使用原理解析
2020/03/21 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
解决Pycharm双击图标启动不了的问题(JetBrains全家桶通用)
2020/08/07 Python
Python自动创建Excel并获取内容
2020/09/16 Python
HTML高亮关键字的实现代码
2018/10/22 HTML / CSS
荷兰网上买鞋:MooieSchoenen.nl
2017/09/12 全球购物
实习教师自我鉴定
2013/12/09 职场文书
六年级数学教学反思
2014/02/03 职场文书
服务之星事迹材料
2014/05/03 职场文书