草庐IT

torch.cat()中dim说明

IT pupil 2023-04-22 原文

torch.cat()

torch.cat(Tuple[Tensor],dim)->Tensor

输入为Tensor的List/Tuple,输出为一个Tensor

torch.cat()用于对张量的拼接,与数组拼接函数torch.stack()用法类似,二者区别在于输入的变量是数组还是张量。

其中初学者最费解的就是dim的选取,dim的取值范围由输入张量的维度决定,输入为n维张量,dim取值在[0,n-1],接下来我们以实验理解dim不同取值对应的不同操作结果。

初次接触众多博客对dim的讲解为,对于两个二维张量作为输入,dim取0结果为两个张量按行拼接,取1结果为按列拼接,但是对于高维来说就有点难以直观想象结果了,我们尝试三维情况进而总结规律。

 先从一个简单的例子入手,输入两个张量为二维,dim取值分别为0和1 :

 

import torch
X=torch.tensor([[1,2,3],[4,5,6]])
Y=torch.tensor([[7,8,9],[1,4,7]])
input=[X,Y]
A=torch.cat(input,dim=0)
B=torch.cat(input,dim=1)
print("X:{}\nY:{}\ndim0:{}\ndim1:{}".format(X,Y,A,B))

           

结果如下

       

 可以看出对于两个二维张量作为输入,dim取0结果为两个张量按行拼接,取1结果为按列拼接,但是对于高维来说就有点难以直观想象结果了,我们尝试三维情况进而总结规律。

import torch
X=torch.tensor([[[1,2],[3,4]],[[5,6],[7,8]]])
Y=torch.tensor([[[7,6],[5,4]],[[8,9],[9,10]]])
input=[X,Y]
A=torch.cat(input,dim=0)
B=torch.cat(input,dim=1)
C=torch.cat(input,dim=2)

print("X:{}\nY:{}\ndim0:{}\ndim1:{}\ndim2:{}".format(X,Y,A,B,C))

                 

输入为两个三维张量:

                          

输出:

                 

可见对于dim=0,其输出结果为对两个张量的最高维度包含的内容进行拼接,此例中,X和Y均为三维张量,其最高维度包含的内容为二维,因此,dim=0结果是对其二维张量进行拼接组成的三维张量:

                  

 那么对于dim=1的情况,就是对次高维包含内容进行拼接,次高维为2维,其内容为1维,将1维进行拼接得到:

         

以此类推,对于dim=n-1的情况比较难理解,此例dim=2,对次次高维即1维的内容进行拼接,其中1维的内容是0维,可以理解为1维张量括号内的元素,即每个数字,将其进行拼接,得到结果:

            

 

 至此,torch.cat()的dim作用已经讲清楚,建议动手实验一下就可以弄明白其中的奥秘!!!

 

有关torch.cat()中dim说明的更多相关文章

  1. spring.profiles.active和spring.profiles.include的使用及区别说明 - 2

    转自:spring.profiles.active和spring.profiles.include的使用及区别说明下文笔者讲述spring.profiles.active和spring.profiles.include的区别简介说明,如下所示我们都知道,在日常开发中,开发|测试|生产环境都拥有不同的配置信息如:jdbc地址、ip、端口等此时为了避免每次都修改全部信息,我们则可以采用以上的属性处理此类异常spring.profiles.active属性例:配置文件,可使用以下方式定义application-${profile}.properties开发环境配置文件:application-dev

  2. ruby-on-rails - ActiveRecord:除非另有说明,否则在保存之前使所有文本字段都调用 strip - 2

    多年来,我在各种网站上遇到过各种问题,用户在字符串和文本字段的开头/结尾放置空格。有时这些会导致格式/布局问题,有时会导致搜索问题(即搜索顺序看起来不对,但实际上并非如此),有时它们实际上会使应用程序崩溃。我认为这会很有用,而不是像我过去所做的那样放入一堆before_save回调,向ActiveRecord添加一些功能以在保存之前自动调用任何字符串/文本字段上的.strip,除非我告诉它不是,例如do_not_strip:field_x,:field_y或类定义顶部的类似内容。在我去弄清楚如何做到这一点之前,有没有人看到更好的解决方案?明确一点,我已经知道我可以做到这一点:befor

  3. ruby - 如何从 Chef 说明书中的库访问当前节点? - 2

    我正在尝试为ChefRecipe编写一个库,以简化一些常见的搜索。例如,我希望能够在cookbook/libraries/library.rb中执行类似的操作,然后从同一Recipe中的Recipe中使用它:moduleExampledefself.search_attribute(attribute_name)returnsearch(:nodes,node[attribute_name])endend问题是,在Chef库文件中,node对象或search函数都不可用。似乎可以使用Chef::Search::Query.new().search(...)进行搜索,但我找不到任何可以访

  4. ruby - 关于 Ruby << 运算符的说明 - 2

    我对Ruby很陌生,想知道运算符(operator)。当我用谷歌搜索这个运算符时,它说它是一个二进制左移运算符,给出了这个例子:awillgive15whichis11110000然而,它在这段代码中似乎不是“二进制左移运算符”:classTextCompressorattr_reader:unique,:indexdefinitialize(text)@unique=[]@index=[]add_text(text)enddefadd_text(text)words=text.splitwords.each{|word|doadd_word(word)}enddefadd_word(

  5. 解决 AssertionError Torch not compiled with CUDA enabled - 2

    最近在矩池云的的TeslaK80机子上跑MMYOLO,跟着MMYOLO官方文档《自定义数据集标注+训练+测试+部署全流程》操作到“2.1.1软件或者算法辅助”时,利用预训练模型+官方脚本去辅助标注时,一按下回车就报错:报错信息AssertionErrorTorchnotcompiledwithCUDAenabled报错信息分析说的是torch编译的时候CUDA不可用但是服务器已经预装有pytorch和cuda了,我分别用nvidia-smi和nvcc-V都可以查到CUDA的版本本机配置如下:但是我在ipython中查看torch.cuda.is_available()返回结果是false,报错

  6. ruby - 带格式说明符的命名格式字符串参数 - 2

    在Ruby中,您可以使用String#%将参数替换为C风格的格式字符串方法,像这样:'%.3dcanbeexpressedinbinaryas%b'%[30,30]#=>"030canbeexpressedinbinaryas11110"Kernel#sprintf和Kernel#format行为相似:sprintf('%.3dcanbeexpressedinbinaryas%b',30,30)#=>"030canbeexpressedinbinaryas11110"format('%.3dcanbeexpressedinbinaryas%b',30,30)#=>"030canbeex

  7. H3CIE A套需求说明 - 2

    实验配置:点击跳转组网需求:总部网络由两台路由器r1r2和三台交换机sw1sw2sw3组成,其中r1作为企业所有分支二节点广域网接入路由器,r2作为企业所有分支一节点广域网接入路由器,sw1sw2sw3组成总部局域网核心,路由器r5和交换机sw4用来模拟企业的一个分支一节点网络,路由器r3和r4分别用来模拟企业的两个分支二节点网络,sw5用来模拟互联网。分支一节点通过一条2M的线路(背对背专线模拟)和总部相连接,分支二节点采用greoveripsec的方式跨越互联网接入总部网络整个企业应用分为两种业务,A流和B流AB两种业务,各个分支节点都可以和总部互通,A流的分之二节点之间,以及分支一和分之

  8. DRV8825步进电机驱动详细说明书————含接线图 - 2

    最近玩步进电机时候,发现步进电机驱动种类多;A4988,drv8825,tb6600,lv8731……;tb6600驱动电流可达4A,1600细分,十分强大,但是体积大,用在平衡车上不太合适。drv8825加散热器驱动电流可达2.5A,32细分,还不错。芯片介绍这里的介绍只介绍其引脚连接。如图是它的说明书中对引脚的解释在这里把它翻译成中文。  为了方便大家使用,说明书还给出了一种典型的连接方式 这样初始化好之后,将AOUT1、AOUT2、BOUT1、BOUT2分别连接到步进电机对应信号线,AOUT1与AOUT2同相,BOUT1与BOUT2同相。判断步进电机信号线是否同相的一个方法是将其中两条接

  9. Ruby mixin 覆盖方法说明 - 2

    我刚刚遇到了这种我不太理解的行为。moduleMdeffoo"module_foo"endendclassCdeffoo"class_foo"endincludeMendputsC.new.foo为什么C.new.foo实际上返回class_foo?我非常确定该方法应该被模块中的方法覆盖。另一件事,将"class_foo"替换为super会使C.new.foo返回`"module_foo"这实际上看起来像是在定义类实例方法之前以某种方式包含了模块。你能解释一下吗? 最佳答案 来自ProgrammingRuby关于mixin的部分:I

  10. ruby - Errno::ENOMEM:无法分配内存 - cat - 2

    我有一个在生产环境中运行的工作,它处理xml文件。xml文件总计约4k,大小为8到9GB。处理后,我们得到CSV文件作为输出。我有一个cat命令,它将所有CSV文件合并到一个我得到的文件中:Errno::ENOMEM:Cannotallocatememorycat(反引号)命令。以下是一些细节:系统内存-4GB交换-2GBruby:1.9.3p286使用nokogiri和saxbuilder-0.0.8处理文件。这里有一段代码可以处理4,000个XML文件,输出以CSV格式保存(每个xml1个)(抱歉,因为公司政策,我不想分享它)。下面是将输出文件合并为一个文件的代码Dir["#{pr

随机推荐