pytorch中torch.stack()函数用法解读

 更新时间:2024年04月24日 08:54:32   作者:RealWeakCoder  
这篇文章主要介绍了pytorch中torch.stack()函数用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

torch.stack()函数用法

一、基本功能

pytroch官方文档对于这个函数的描述很简略。

只有一句话:

在维度上连接(concatenate)若干个张量。(这些张量形状相同)。

经过代码总结归纳,可以得到stack(tensors,dim=0,out=None)函数的功能:

将若干个张量在dim维度上连接,生成一个扩维的张量,比如说原来你有若干个2维张量,连接可以得到一个3维的张量。

设待连接张量维度为n,dim取值范围为-n-1~n,这里得提一下为负的意义:-i为倒数第i个维度。

举个例子:

对于2维的待连接张量,-1维即3维,-2维即2维。

上代码:

a=torch.tensor([[1,2,3],[4,5,6]])
b=torch.tensor([[10,20,30],[40,50,60]])
c=torch.tensor([[100,200,300],[400,500,600]])
print(torch.stack([a,b,c],dim=0))
print(torch.stack([a,b,c],dim=1))
print(torch.stack([a,b,c],dim=2))
print(torch.stack([a,b,c],dim=0).size())
print(torch.stack([a,b,c],dim=1).size())
print(torch.stack([a,b,c],dim=2).size())
#输出结果为:
tensor([[[  1,   2,   3],
         [  4,   5,   6]],

        [[ 10,  20,  30],
         [ 40,  50,  60]],

        [[100, 200, 300],
         [400, 500, 600]]])
tensor([[[  1,   2,   3],
         [ 10,  20,  30],
         [100, 200, 300]],

        [[  4,   5,   6],
         [ 40,  50,  60],
         [400, 500, 600]]])
tensor([[[  1,  10, 100],
         [  2,  20, 200],
         [  3,  30, 300]],

        [[  4,  40, 400],
         [  5,  50, 500],
         [  6,  60, 600]]])
torch.Size([3, 2, 3])
torch.Size([2, 3, 3])
torch.Size([2, 3, 3])

二、规律分析

通过代码运行结果,我们不难发现,stack(tensors,dim=0,out=None)函数的运行机制可以等价为:

  • dim=0时,将tensor在一维上连接,简单来说就是,就是将tensor1,tensor2…tensor n,连接为【tensor1,tensor2… tensor n】(就是在这里产生了扩维)
  • dim=1时,将每个tensor的第i行按行连接组成一个新的2维tensor,再将这些新tensor按照dim=0的方式连接。
  • dim=2时,将每个tensor的第i行转置后按列连接组成一个新的2维tensor,再将这些新tesnor按照dim=0的方式连接

可以得到一个结论:n维(n>=2)待连接张量按dim=x的方式连接等价于:

  • 若x=0,参照上面的规律进行连接
  • 若x>0,对每个张量的第一个维度下的张量对应地按照dim=x-1的方式进行连接得到若干个新张量,这些新张量按照dim=0的方式进行连接。
  • 很明显,该规律具有递归的特性,x=0,1,2的基础情况已经给出。

注:以上规律是在未看函数实现源码基础上未加证明的猜测。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅析Python中的变量赋值与多重赋值

    浅析Python中的变量赋值与多重赋值

    在 Python 中,变量赋值是编程中常见的操作之一,本文将深入探讨 Python 中的变量赋值和多重赋值,包括其基本语法、特性、应用场景以及示例代码,需要的可以参考下
    2024-03-03
  • Python学习之线程池与GIL全局锁详解

    Python学习之线程池与GIL全局锁详解

    本文我们将学习线程池的创建与全局锁。线程池的创建于进程池的原理是相同的;关于GIL全局锁,暂时没有代码上的练习,而是对其概念进行一个简单的启蒙,感兴趣的可以了解一下
    2022-04-04
  • 利用Python和PyQt5构建一个多功能PDF转换器

    利用Python和PyQt5构建一个多功能PDF转换器

    在日常工作中,处理PDF文件几乎是每个人都不可避免的任务,本文将通过Python和PyQt5搭建一个强大的PDF文件处理平台,希望对大家有所帮助
    2024-12-12
  • python打包多类型文件的操作方法

    python打包多类型文件的操作方法

    这篇文章主要介绍了python打包多类型文件的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Python Paramiko创建文件目录并上传文件详解

    Python Paramiko创建文件目录并上传文件详解

    Paramiko是一个用于进行SSH2会话的Python库,它支持加密、认证和文件传输等功能,本文旨在详细指导新手朋友如何使用Python的Paramiko库来创建远程文件目录并上传文件,希望对大家有所帮助
    2024-10-10
  • Python进程间通信之共享内存详解

    Python进程间通信之共享内存详解

    这篇文章主要为大家详细介绍了Python进程间通信之共享内存的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • Python单例模式实例详解

    Python单例模式实例详解

    这篇文章主要介绍了Python单例模式,结合实例形式分析了单例模式的概念、实现与使用方法、已经相关注意事项,需要的朋友可以参考下
    2017-03-03
  • Python图像处理之图像的灰度线性变换

    Python图像处理之图像的灰度线性变换

    这篇文章主要介绍了Python图像处理之图像的灰度线性变换,文章围绕主题展开详细的内容戒杀,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 使用Python编写一个在Linux下实现截图分享的脚本的教程

    使用Python编写一个在Linux下实现截图分享的脚本的教程

    这篇文章主要介绍了使用Python编写一个在Linux下实现截图分享的脚本的教程,利用到了scrot和urllib2库,需要的朋友可以参考下
    2015-04-04
  • 15个应该掌握的Jupyter Notebook使用技巧(小结)

    15个应该掌握的Jupyter Notebook使用技巧(小结)

    这篇文章主要介绍了15个应该掌握的Jupyter Notebook使用技巧(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09

最新评论