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的list相关知识(推荐)
Aug 30 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
python实现log日志的示例代码
Apr 28 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
May 24 Python
Windows下将Python文件打包成.EXE可执行文件的方法
Aug 03 Python
python实现多进程代码示例
Oct 31 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
Opencv求取连通区域重心实例
Jun 04 Python
django 实现后台从富文本提取纯文本
Jul 02 Python
浅析NumPy 切片和索引
Sep 02 Python
python的链表基础知识点
Sep 13 Python
Python爬虫之Selenium设置元素等待的方法
Dec 04 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遍历CSV类实例
2015/04/14 PHP
jQuery的实现原理的模拟代码 -4 重要的扩展函数 extend
2010/08/03 Javascript
基于Jquery制作的幻灯片图集效果打包下载
2011/02/12 Javascript
JS将秒换成时分秒实现代码
2013/09/03 Javascript
jquery选择器使用详解
2014/04/08 Javascript
jquery实现点击文字可编辑并修改保存至数据库
2014/04/15 Javascript
jQuery在页面加载时动态修改图片尺寸的方法
2015/03/20 Javascript
touch.js 拖动、缩放、旋转 (鼠标手势)功能代码
2017/02/04 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
jQuery日期范围选择器附源码下载
2017/05/23 jQuery
微信小程序学习之数据处理详解
2017/07/05 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
简单实现jQuery弹窗效果
2017/10/30 jQuery
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
使用next.js开发网址缩短服务的方法
2020/06/17 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
[05:39]2014DOTA2西雅图国际邀请赛 淘汰赛7月14日TOPPLAY
2014/07/14 DOTA
[01:33]完美世界DOTA2联赛PWL S3 集锦第二期
2020/12/21 DOTA
介绍Python的@property装饰器的用法
2015/04/28 Python
python连接数据库的方法
2017/10/19 Python
python抓取京东小米8手机配置信息
2018/11/13 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
2019/02/19 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
python实现大量图片重命名
2020/03/23 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
Keras SGD 随机梯度下降优化器参数设置方式
2020/06/19 Python
解决PyCharm不在run输出运行结果而不是再Console里输出的问题
2020/09/21 Python
python连接mysql数据库并读取数据的实现
2020/09/25 Python
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
电子工程专业毕业生求职信
2014/03/14 职场文书
平安校园建设方案
2014/05/02 职场文书
岗位聘任报告
2015/03/02 职场文书
莫言诺贝尔获奖感言(全文)
2015/07/31 职场文书
经典格言警句:没有热忱,世间便无进步
2019/11/13 职场文书
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang