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 OS模块常用函数说明
May 23 Python
Pandas标记删除重复记录的方法
Apr 08 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
May 21 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
在cmder下安装ipython以及环境的搭建
Oct 19 Python
Python实现的字典排序操作示例【按键名key与键值value排序】
Dec 21 Python
python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结
Jul 04 Python
Python 堆叠柱状图绘制方法
Jul 29 Python
python matplotlib库绘制条形图练习题
Aug 10 Python
python基于json文件实现的gearman任务自动重启代码实例
Aug 13 Python
python GUI库图形界面开发之PyQt5打印控件QPrinter详细使用方法与实例
Feb 28 Python
python基础入门之字典和集合
Jun 13 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
为php4加入动态flash文件的生成的支持
2006/10/09 PHP
iOS自定义提示弹出框实现类似UIAlertView的效果
2016/11/16 PHP
PHP实现的多维数组排序算法分析
2018/02/10 PHP
RSA实现JS前端加密与PHP后端解密功能示例
2019/08/05 PHP
Aster vs KG BO3 第三场2.18
2021/03/10 DOTA
javascript两段代码,两个小技巧
2010/02/04 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
jQuery Lightbox 图片展示插件使用说明
2010/04/25 Javascript
javascript数据结构之双链表插入排序实例详解
2015/11/25 Javascript
AngularJS 入门教程之事件处理器详解
2016/08/19 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
基于javascript的异步编程实例详解
2017/04/10 Javascript
JS实现闭包中的沙箱模式示例
2017/09/07 Javascript
jQuery 禁止表单用户名、密码自动填充功能
2017/10/30 jQuery
vue scroller返回页面记住滚动位置的实例代码
2018/01/29 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
2018/04/05 Javascript
用Vue写一个分页器的示例代码
2018/04/22 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
Vue中 axios delete请求参数操作
2020/08/25 Javascript
[04:42]5分钟带你了解什么是DOTA2(第一期)
2017/02/07 DOTA
pycharm 使用心得(四)显示行号
2014/06/05 Python
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
python判断元素是否存在的实例方法
2020/09/24 Python
如何利用python 读取配置文件
2021/01/06 Python
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
学校十一活动方案
2014/02/01 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
学校安全生产月活动总结
2014/07/05 职场文书
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python