Liuchen1997 / RFAConv

RAFConv: Innovating Spatital Attention and Standard Convolutional Operation
136 stars 18 forks source link

关于adjust shape的问题 #13

Open Hongru0306 opened 8 months ago

Hongru0306 commented 8 months ago

您好,非常感谢您的工作!
看到您的论文里关于adjust shape的描述是这样的:
image 但是我看到源码中对于shape的更改是这样的:

 generate_feature = rearrange(generate_feature, 'b c (n1 n2) h w -> b c (h n1) (w n2)', n1=self.kernel_size,
                         n2=self.kernel_size)

对于rearrange这个库我实践了一下是这样的结果:

from einops import rearrange
import torch

demo = torch.arange(36).view(9, 2, 2)
print('demo: ', demo)
out = rearrange(demo, '(k1 k2) w h -> 1 (k1 w) (k2 h)', k1=3, k2=3)
print('end=', out)

# output
demo:  tensor([[[ 0,  1],
         [ 2,  3]],

        [[ 4,  5],
         [ 6,  7]],

        [[ 8,  9],
         [10, 11]],

        [[12, 13],
         [14, 15]],

        [[16, 17],
         [18, 19]],

        [[20, 21],
         [22, 23]],

        [[24, 25],
         [26, 27]],

        [[28, 29],
         [30, 31]],

        [[32, 33],
         [34, 35]]])
end= tensor([[[ 0,  1,  4,  5,  8,  9],
         [ 2,  3,  6,  7, 10, 11],
         [12, 13, 16, 17, 20, 21],
         [14, 15, 18, 19, 22, 23],
         [24, 25, 28, 29, 32, 33],
         [26, 27, 30, 31, 34, 35]]])

这个结果与图中的adjust好像不一样,并不是小矩阵对应左上角的的元素全都集中在adjust后的左上区域,而是将9个小矩阵顺序排列的,没有改变矩阵内部的关系,这样的话并没有对图像做类似放大的操作,而只是将图像进行了排列,这样对于权重共享问题是为什么work的呢?
十分期待您的解答!!

Hongru0306 commented 7 months ago

在使用rearrange前维度使用view发生了变化,这是我加入前面的view做的实验,希望对你有用


feature = torch.arange(36).view(9, 2, 2)
print('feature: ', feature)
feature = feature.view(1, 9, 2, 2)  #c*kernel**2,h,w ->  c k**2 h w   获得感受野空间特征
conv_data = rearrange(feature, 'c (n1 n2) h w ->c (h n1) (w n2)', n1=3,n2=3) # c k**2 h w ->  c h*k w*k
print('conv_data: ', conv_data)
feature:  tensor([[[ 0,  1],
         [ 2,  3]],

        [[ 4,  5],
         [ 6,  7]],

        [[ 8,  9],
         [10, 11]],

        [[12, 13],
         [14, 15]],

        [[16, 17],
         [18, 19]],

        [[20, 21],
         [22, 23]],

        [[24, 25],
         [26, 27]],

        [[28, 29],
         [30, 31]],

        [[32, 33],
         [34, 35]]])
conv_data:  tensor([[[ 0,  4,  8,  1,  5,  9],
         [12, 16, 20, 13, 17, 21],
         [24, 28, 32, 25, 29, 33],
         [ 2,  6, 10,  3,  7, 11],
         [14, 18, 22, 15, 19, 23],
         [26, 30, 34, 27, 31, 35]]])

谢谢!感谢大佬解答!

CV-ZhangXin commented 7 months ago

@Hongru0306 不好意思,好久没上Github了,你要注意位置的变化。 ,你写的是 out = rearrange(demo, '(k1 k2) w h -> 1 (k1 w) (k2 h)', k1=3, k2=3) 而实际上是 out = rearrange(demo, '(k1 k2) w h -> 1 (w k1) ( h k2)', k1=3, k2=3)。