songlei-xiong / ATFuse

Code for: Rethinking Cross-Attention for Infrared and Visible Image Fusion
25 stars 1 forks source link

FactorAtt_ConvRelPosEnc中的use_efficient #1

Open Leonhard-Euler-ai opened 5 months ago

Leonhard-Euler-ai commented 5 months ago

作者你好,FactorAtt_ConvRelPosEnc模块中当前代码use_efficient=True,计算_差异信息_的方式与您论文中x = v - factor_att不一致,当前直接使用x = factor_att,请问这样做的性能更好吗 k与v之间做attention的原理是什么? 期待您的回复!

songlei-xiong commented 5 months ago

DIIM仅使用了一次,后续两个是ACIIM,你可以仔细看下,第一个模块走的应该不是你说的那,两个模块传入的布尔符号是不一样的。你说的那个是后面两个ACIIM才从这走的

Leonhard-Euler-ai commented 5 months ago
# Factorized attention.
use_efficient = minus
if use_efficient:
    k_softmax = k.softmax(dim=2)

    k_softmax_T_dot_v = einsum("b h n k, b h n v -> b h k v", k_softmax, v)
    factor_att = einsum("b h n k, b h k v -> b h n v", q, k_softmax_T_dot_v)
else:
    # minus = Softmin(dim=2)
    # k_softmax = minus(k)
    # k_softmax_T_dot_v = einsum("b h n k, b h n v -> b h k v", k_softmax, v)
    # factor_att = einsum("b h n k, b h k v -> b h n v", q, k_softmax_T_dot_v)
    k_softmax = k.softmax(dim=2)

    k_softmax_T_dot_v = einsum("b h n k, b h n v -> b h k v", k_softmax, v)
    factor_att = einsum("b h n k, b h k v -> b h n v", q, k_softmax_T_dot_v)

https://github.com/songlei-xiong/ATFuse/blob/25a402ce87e5586ae220b65868b5ff061afdb997/networks/ATFuse.py#L214

好的,谢谢你,我看到DIIM设置minus=False了。 那请问用k做softmax的原理是什么?(如上214行)您把softmax(q@k)的代码注释了 这种做法有可以参考的依据吗

songlei-xiong commented 5 months ago

这是对内存消耗做了优化的写法。

bingkun99 commented 3 months ago
# Factorized attention.
use_efficient = minus
if use_efficient:
    k_softmax = k.softmax(dim=2)

    k_softmax_T_dot_v = einsum("b h n k, b h n v -> b h k v", k_softmax, v)
    factor_att = einsum("b h n k, b h k v -> b h n v", q, k_softmax_T_dot_v)
else:
    # minus = Softmin(dim=2)
    # k_softmax = minus(k)
    # k_softmax_T_dot_v = einsum("b h n k, b h n v -> b h k v", k_softmax, v)
    # factor_att = einsum("b h n k, b h k v -> b h n v", q, k_softmax_T_dot_v)
    k_softmax = k.softmax(dim=2)

    k_softmax_T_dot_v = einsum("b h n k, b h n v -> b h k v", k_softmax, v)
    factor_att = einsum("b h n k, b h k v -> b h n v", q, k_softmax_T_dot_v)

https://github.com/songlei-xiong/ATFuse/blob/25a402ce87e5586ae220b65868b5ff061afdb997/networks/ATFuse.py#L214

好的,谢谢你,我看到DIIM设置minus=False了。 那请问用k做softmax的原理是什么?(如上214行)您把softmax(q@k)的代码注释了 这种做法有可以参考的依据吗

您好,这个DIIM模块作者卸载哪里了呀,我怎莫没有找到,您找到了吗?

Leonhard-Euler-ai commented 3 months ago

@bingkun99 FactorAtt_ConvRelPosEncMHCABlock 共同组成了DIIM模块,作者没有按照论文中命名,并且这些模块是被其他结构复用的,具体的计算图你可以调试着看 应该和论文是一致的

bingkun99 commented 3 months ago

@bingkun99 FactorAtt_ConvRelPosEncMHCABlock 共同组成了DIIM模块,作者没有按照论文中命名,并且这些模块是被其他结构复用的,具体的计算图你可以调试着看 应该和论文是一致的

感谢