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 BeautifulSoup设置页面编码的方法
Apr 03 Python
Django中URL视图函数的一些高级概念介绍
Jul 20 Python
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
彻底理解Python list切片原理
Oct 27 Python
python 实现数组list 添加、修改、删除的方法
Apr 04 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
Django之使用celery和NGINX生成静态页面实现性能优化
Oct 08 Python
python 利用turtle模块画出没有角的方格
Nov 23 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
Jan 08 Python
Mac PyCharm中的.gitignore 安装设置教程
Apr 16 Python
基于PyTorch实现一个简单的CNN图像分类器
May 29 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
Sep 25 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
摩卡咖啡
2021/03/03 咖啡文化
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
jQuery登陆判断简单实现代码
2013/04/21 Javascript
jQuery自动切换/点击切换选项卡效果的小例子
2013/08/12 Javascript
Js保留小数点的4种效果实现代码分享
2014/04/12 Javascript
使用正则表达式的格式化与高亮显示json字符串
2014/12/03 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
javascript中BOM基础知识总结
2017/02/14 Javascript
nodejs multer实现文件上传与下载
2017/05/10 NodeJs
原生JS实现不断变化的标签
2017/05/22 Javascript
angular使用bootstrap方法手动启动的实例代码
2017/07/18 Javascript
jQuery选择器之属性过滤选择器详解
2017/09/28 jQuery
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
Puppet的一些技巧
2018/09/17 Javascript
vue实现点击隐藏与显示实例分享
2019/02/13 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
JavaScript提升机制Hoisting详解
2019/10/23 Javascript
vue keep-alive 动态删除组件缓存的例子
2019/11/04 Javascript
jQuery实现动态加载瀑布流
2020/09/01 jQuery
[26:50]2018完美盛典DOTA2表演赛
2018/12/17 DOTA
Python中logging模块的用法实例
2014/09/29 Python
Python把csv数据写入list和字典类型的变量脚本方法
2018/06/15 Python
详解Python用户登录接口的方法
2019/04/17 Python
python实现批量修改服务器密码的方法
2019/08/13 Python
Python3如何对urllib和urllib2进行重构
2019/11/25 Python
Python语法之精妙的十个知识点(装B语法)
2020/01/18 Python
python shapely.geometry.polygon任意两个四边形的IOU计算实例
2020/04/12 Python
Python matplotlib 绘制双Y轴曲线图的示例代码
2020/06/12 Python
详解python tcp编程
2020/08/24 Python
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
《骑牛比赛》教后反思
2014/04/22 职场文书
反腐倡廉标语
2014/06/24 职场文书
使用Python解决图表与画布的间距问题
2022/04/11 Python