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操作列表的常用方法分享
Feb 13 Python
由Python运算π的值深入Python中科学计算的实现
Apr 17 Python
使用FastCGI部署Python的Django应用的教程
Jul 22 Python
python爬虫的工作原理
Mar 05 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
Sep 26 Python
python如何通过twisted实现数据库异步插入
Mar 20 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
May 25 Python
Python实现子类调用父类的初始化实例
Mar 12 Python
python pyecharts 实现一个文件绘制多张图
May 13 Python
Django中的模型类设计及展示示例详解
May 29 Python
scrapy头部修改的方法详解
Dec 06 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
Mar 03 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读取文件内容后清空文件示例代码
2014/03/18 PHP
codeigniter集成ucenter1.6双向通信的解决办法
2014/06/12 PHP
php while循环控制的简单实例
2016/05/30 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
php实现文件上传基本验证
2020/03/04 PHP
在JavaScript中使用inline函数的问题
2007/03/08 Javascript
基于jQuery的日期选择控件
2009/10/27 Javascript
javascript制作2048游戏
2015/03/30 Javascript
JS实现的鼠标跟随代码(卡通手型点击效果)
2015/10/26 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
微信小程序 密码输入(源码下载)
2017/06/27 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
jQuery仿移动端支付宝键盘的实现代码
2018/08/15 jQuery
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
Vue中全局变量的定义和使用
2019/06/05 Javascript
JS轮播图的实现方法
2020/08/24 Javascript
ES5和ES6中类的区别总结
2020/12/21 Javascript
[04:29]2016国际邀请赛中国区预选赛Ehome战队教练采访
2016/06/27 DOTA
Python的shutil模块中文件的复制操作函数详解
2016/07/05 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
Python快速从注释生成文档的方法
2016/12/26 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
详解Python列表赋值复制深拷贝及5种浅拷贝
2019/05/15 Python
Python pandas DataFrame操作的实现代码
2019/06/21 Python
Pytorch转keras的有效方法,以FlowNet为例讲解
2020/05/26 Python
pandas.DataFrame.drop_duplicates 用法介绍
2020/07/06 Python
前端面试必备之html5的新特性
2017/09/05 HTML / CSS
教你如何一步一步用Canvas写一个贪吃蛇
2018/10/22 HTML / CSS
叙述DBMS对数据控制功能有哪些
2016/06/12 面试题
向领导表决心的话
2014/03/11 职场文书
医德医魂心得体会
2014/09/11 职场文书
教师工作失职检讨书
2014/09/18 职场文书
西安导游词
2015/02/12 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
Linux中如何安装并部署Redis
2022/04/18 Servers