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的id()函数解密过程
Dec 25 Python
python回调函数用法实例分析
May 09 Python
python+selenium+autoit实现文件上传功能
Aug 23 Python
解决pycharm界面不能显示中文的问题
May 23 Python
钉钉群自定义机器人消息Python封装的实例
Feb 20 Python
python实现文件助手中查看微信撤回消息
Apr 29 Python
使用python对多个txt文件中的数据进行筛选的方法
Jul 10 Python
Django中自定义admin Xadmin的实现代码
Aug 09 Python
使用Python的datetime库处理时间(RPA流程)
Nov 24 Python
零基础学python应该从哪里入手
Aug 11 Python
Pycharm常用快捷键总结及配置方法
Nov 14 Python
教你怎么用python selenium实现自动化测试
May 27 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
杏林同学录(三)
2006/10/09 PHP
php中的登陆login
2007/01/18 PHP
一个简单的PHP投票程序源码
2007/03/11 PHP
PHP开发过程中常用函数收藏
2009/12/14 PHP
按上下级层次关系输出内容的PHP代码
2010/07/17 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
php+redis实现商城秒杀功能
2020/11/19 PHP
PHP实现redis限制单ip、单用户的访问次数功能示例
2018/06/16 PHP
jquery移除、绑定、触发元素事件使用示例详解
2014/04/10 Javascript
ajaxFileUpload.js插件支持多文件上传的方法
2014/09/02 Javascript
浅谈js中变量初始化
2015/02/03 Javascript
详解javascript遍历方式
2015/11/11 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
jQuery.Form上传文件操作
2017/02/05 Javascript
纯js的右下角弹窗实例
2017/03/12 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
vue组件之间通信方式实例总结【8种方式】
2019/02/22 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
2019/07/31 Javascript
layui 上传文件_批量导入数据UI的方法
2019/09/23 Javascript
[02:19]DOTA2上海特级锦标赛 观赛指南 Spectator Guide
2016/02/04 DOTA
Apache如何部署django项目
2017/05/21 Python
python 脚本生成随机 字母 + 数字密码功能
2018/05/26 Python
Django添加sitemap的方法示例
2018/08/06 Python
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
python解析xml简单示例
2019/06/21 Python
python 模拟银行转账功能过程详解
2019/08/06 Python
Python-opencv 双线性插值实例
2020/01/17 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
开学典礼策划方案
2014/05/28 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
政府领导干部个人对照检查材料思想汇报
2014/09/24 职场文书
2019初中学生入团申请书
2019/06/27 职场文书
python Polars库的使用简介
2021/04/21 Python
浅谈MySQL函数
2021/10/05 MySQL