首页 > 其他分享 >通道的比较

通道的比较

时间:2024-10-11 17:24:35浏览次数:4  
标签:14 torch coord bmm edge 比较 通道

感谢澄清!让我更详细地解释原来代码中的 torch.bmm(coord_diff, coord_diff.transpose(-1, -2)) 与后续改进后的实现之间的区别。

原始代码的含义

coord_diff = coord[row] - coord[col]  # [n_edge, 14, 3]

radial = torch.bmm(coord_diff, coord_diff.transpose(-1, -2))  # [n_edge, 14, 14]
  1. coord_diff = coord[row] - coord[col]
    这行代码表示的是对每条边上的两个节点(由 rowcol 指定的节点对)的坐标进行差值计算。coord_diff 的形状是 [n_edge, n_channel, d],也就是 [n_edge, 14, 3],其中:

    • n_edge: 边的数量(图中边的数目)。
    • n_channel = 14: 每个节点有14个通道。
    • d = 3: 表示每个节点的坐标是3维的 (x, y, z)。
  2. torch.bmm(coord_diff, coord_diff.transpose(-1, -2))
    这行代码使用了批量矩阵乘法(torch.bmm)。具体含义如下:

    • coord_diff 是形状 [n_edge, 14, 3] 的张量,表示边的两个节点之间在14个通道上的坐标差异。
    • coord_diff.transpose(-1, -2)coord_diff 的最后两个维度 314 交换,得到形状 [n_edge, 3, 14]

    然后使用 torch.bmm 进行批量矩阵乘法,计算每条边的14个通道在3维坐标上的自相关性,结果是一个形状为 [n_edge, 14, 14] 的矩阵,表示每条边的两个节点在14个通道上相互间的几何关系。

计算方式的细节

  1. 原始计算方式的输出

    • [n_edge, 14, 14] 代表每条边上两个节点在14个通道上的内积(通道与通道之间的关系),它实际上捕捉了节点间不同通道的几何差异。这个矩阵表示14个通道之间的交互关系,反映了边上节点之间的几何关系。
  2. torch.bmm 的作用

    • torch.bmm 是一种批量矩阵乘法,用于在每个边上计算两个节点的坐标差异的矩阵乘积。
    • coord_diff 和其转置矩阵相乘,得到每个通道与其他通道之间的相互影响,形成了 [n_edge, 14, 14] 的矩阵。这种方式可以捕捉到每个通道在3维空间上的内在几何关系。

改进方案

如果你想要将 coord_diff 的维度调整为 [n_edge, 14, 14, 3] 以获得更细致的通道之间的交互,计算会更加复杂。举例来说,可以使用 torch.einsum 来代替 torch.bmm,使得计算更灵活。

例如,改进版:

coord_diff1 = coord[row].unsqueeze(2) - coord[col].unsqueeze(1)  # [n_edge, 14, 14, 3]

# 使用 einsum 来计算每个通道之间的交互关系
radial = torch.einsum('eijc,eikc->eij', coord_diff1, coord_diff1)  # [n_edge, 14, 14]
  • 通过 unsqueeze 操作,将每个节点的通道与其他通道分别进行比较,生成 [n_edge, 14, 14, 3] 的张量。
  • 使用 torch.einsum 将第三个维度(3)进行元素乘积,生成最终的 radial,它是 [n_edge, 14, 14] 的张量,表示通道与通道之间的交互信息。

总结对比

  1. 原始方式

    • 通过 torch.bmm 进行通道与通道之间的内积,结果是 [n_edge, 14, 14],它计算的是每条边的两个节点在14个通道上的几何差异。
    • 每个通道的几何差异是通过节点坐标差异的内积计算得到的,这种方式简单直接。
  2. 改进方式

    • 通过 unsqueezeeinsum,引入了更加细致的通道之间的比较,可以捕捉通道间的复杂交互关系。
    • torch.einsum 允许在通道间更加灵活地计算相互影响,生成一个同样是 [n_edge, 14, 14] 的矩阵,但其计算方式更加灵活,结果更为细致。

选择哪种方式取决于你希望捕捉的几何关系的复杂度。如果你只关心简单的通道几何差异,原始的 torch.bmm 足够。如果你希望捕捉不同通道之间的更复杂的交互关系,可以采用 einsum 方案。

不同的计算方式,结果不同,意义类似

你提到“计算的答案不一样”,这表明虽然 torch.bmmtorch.einsum 的计算方式在逻辑上类似,但它们得出的结果不同。以下是造成结果不同的几个可能原因:

1. 操作顺序不同

torch.bmmtorch.einsum 的计算逻辑不同,它们对矩阵维度的处理方式存在差异:

  • torch.bmm:在原来的方法中,coord_diff 是一个形状为 [n_edge, 14, 3] 的张量。torch.bmm 会进行批量矩阵乘法,它的作用是将 coord_diffcoord_diff 的转置矩阵相乘,从而得到每个边的 [14, 14] 的矩阵。这个操作只涉及到 14 个通道之间的差异。

    • torch.bmm(coord_diff, coord_diff.transpose(-1, -2)) 实际上是在 14 × 3 的矩阵与其 3 × 14 的转置矩阵之间做矩阵乘法,结果是 [n_edge, 14, 14],表示每个通道之间的相互作用。
  • torch.einsum:在新的方法中,coord_diff1[n_edge, 14, 14, 3] 的张量,这意味着每条边的两个节点之间的所有通道组合都被计算。einsum 操作 einsum('eijc,eikc->eij', coord_diff1, coord_diff1) 是在坐标维度(3)上进行逐元素乘积并求和,结果是 [n_edge, 14, 14]

这意味着,虽然两种方法计算的最终结果维度相同(都是 [n_edge, 14, 14]),但计算过程不同,导致答案不一样einsum 会计算每对通道之间的差异,而 bmm 只是计算每个通道自身在坐标维度上的差异。因此,结果虽然形状相同,但具体数值不同。

2. 差异化的几何意义

两种方法在表达几何关系上有微妙的不同:

  • torch.bmm:只处理两个节点的每个通道在 3 维空间上的差异。它不考虑不同通道之间的交互关系。
  • torch.einsum:不仅处理每个通道之间的差异,还处理通道之间的交互。具体而言,einsum 会计算不同通道组合下的差异,这使得计算结果更加细致。

3. unsqueeze 引入的维度差异

einsum 的实现中,你通过 unsqueeze 操作将 coord_diff1 的维度扩展为 [n_edge, 14, 14, 3],这使得每对通道的组合都被考虑到了。相比之下,原始方法中的 bmm 操作只在 [n_edge, 14, 3] 上进行批量矩阵乘法,没有考虑通道之间的交互。

因此,torch.bmm 的计算结果反映的是每个通道的几何差异,而 einsum 的结果则反映了所有通道之间的几何交互差异。这一点是导致两种方法结果不同的核心原因。

4. 矩阵乘法与逐元素乘积的差异

torch.bmm 实际上是标准的矩阵乘法,两个矩阵的乘积通过线性代数规则进行计算。而 einsumeijc, eikc -> eij 操作则是逐元素相乘并在最后一维(坐标维度)上求和。虽然它们都最终输出一个 [n_edge, 14, 14] 的矩阵,但计算过程的核心不同。

  • torch.bmm:是矩阵乘法,将 coord_diff 视为 [14, 3][3, 14] 的矩阵,进行矩阵乘积。
  • einsum:逐元素地对每对通道差异进行点积(沿坐标维度求和),计算每个通道组合之间的几何差异。

因此,torch.bmmtorch.einsum 处理的方式不同,导致了最终结果数值的不同

如何理解这两种方式的区别

  • torch.bmm 只处理每个通道自身的坐标差异:你可以理解为,它计算的是每个节点的某个通道的几何差异,忽略了通道之间的交互。
  • torch.einsum 处理所有通道之间的几何差异:这种方式更细致,因为它不仅考虑了每个通道的差异,还考虑了通道与通道之间的交互。

总结

  • 相同点:两种方法计算的目的是捕捉节点之间的几何差异。
  • 不同点:计算方法不同。torch.bmm 只是在每个通道内计算坐标差异,而 torch.einsum 会考虑每对通道的交互,导致计算结果不同。

如果你只需要计算每个通道的几何差异,torch.bmm 可能是合适的。如果你需要捕捉更复杂的通道间交互,torch.einsum 则提供了更细致的结果。

标签:14,torch,coord,bmm,edge,比较,通道
From: https://www.cnblogs.com/csjywu01/p/18458908

相关文章

  • C# 比较两个集合和比较对象
    1、比较集合///<summary>///比较两个集合///</summary>///<typeparamname="T"></typeparam>///<paramname="list1"></param>///<paramname="list2"></param>///<returns></r......
  • 各排序算法处理速度比较及稳定排序
    排序方法平均时间复杂度最坏时间复杂度选择排序O(n^2)O(n^2)插入排序O(n^2)        O(n^2)冒泡排序O(n^2)O(n^2)堆排序O(nlogn)O(nlogn)归并排序O(nlogn)O(nlogn)快速排序O(nlogn)O(n^2)稳定排序是指包含相同的数据在排序前的顺苏于排序后的顺序是保持一致的......
  • 如果你在写图论 2 的 I 题,这里有一个实现的比较一般的交互库
    #include<bits/stdc++.h>//交互题什么的最讨厌了usingnamespacestd;usingllt=longlong;usingllf=longdouble;usingull=unsignedlonglong;mt19937rnd(ull(newchar)*ull(newchar));constintN=1e5+3;structGph{ inthd[N],to[N<<1],nt[N<<1],......
  • [技巧] 当你遇到某些比较费眼睛的数学公式时
    当我们看一些dalao的博客时,可能会出现这类东西:\[x^{a^{b^{c^{d^{e^{f^{g^{h^{...}}}}}}}}}\]遇见这种东西时,我们一般会用到CTH用ctrl+滚轮放大整个浏览器,但小的总是小,网页是大了,数学公式的占比并没有变,那么遇到这么一驼东西时我们应该怎样做才能保护我们和CTH的眼睛呢?进入正题......
  • 新品发布 | 多通道车载以太网分析仪震撼首发
    VBNET-4302是一款高性能多通道车载以太网分析仪,可进行车载以太网和CAN&nbsp;FD的数据监控解析、通信测试、ECU刷写、产线升级等全场景应用,让汽车总线测试分析更简单!......
  • easyocr 及其 与tesseract的比较
    EasyOCR介绍EasyOCR是一个基于深度学习的开源光学字符识别(OCR)工具,由JaidedAI开发,能够从图片中提取文字信息。与传统OCR工具不同,EasyOCR使用神经网络进行训练和识别,支持80多种语言,并且可以处理复杂的文本布局、手写体和多语言场景等问题。它非常适合从自然场景图像(如路......
  • 八通道示波器推荐
    2024年8月8日,为帮助工程师应对更多测试挑战,RIGOL推出DHO高分辨率示波器家族新成员——DHO5000系列。早在2022年,RIGOL发布了高分辨率数字示波器DHO4000/1000系列,为小信号测试提供了更经济的解决方案;2023年推出了超便携高分辨率示波器DHO800/900系列,进一步普及了高分辨率示波器。......
  • 【无人机】基于改进粒子群算法的无人机路径规划研究[和遗传算法、粒子群算法进行比较]
      ......
  • 844.比较含退格的字符串
    题目:844.比较含退格的字符串-力扣(LeetCode)思路:首先要知道这个#的意思是可以将前面一个数清空,(当时 我以为是将前面一串清空。。。看了半天),由于 # 号只会消除左边的一个字符,所以对右边的字符无影响,所以我们选择从后往前遍历 S,T 字符串,以skipS和T去记录,可以清空前面......
  • 自定义DFS,DFT,DTFT函数并比较关系
    一、DFS(离散傅里叶级数)functiony=DFS(x,L)N=length(x);xi=[x;zeros(L-N,1)]; y=zeros(1,L);fork=1:Lsum=0; forn=1:Lsum=sum+xi(n)*exp(-2j*pi*k*n/L); end y(k)=sum; end end 二、DFT(离散傅里叶变换) functiony=DFT(x,L)N......