sophgo / tpu-mlir

Machine learning compiler based on MLIR for Sophgo TPU.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

BackWardH

qiuliang1993 opened this issue · comments

hi,大佬,在感受野倒推时遇到TransPoseConv2d(上采样)算子时,当start idx 与感受野大小不能被2整除时,为什么采用的是向上取整呢?这样很容易出现位置对不上的情况

commented

能详细说一下在什么情况下遇到的这个问题吗?这里的start idx是哪部分定义的参数?

请问,是遇到了bug么?能提供下测试用例吗?

没有遇到bug,只是按照代码中的逻辑,在指定pixel id和slice size的条件下,推算了Transposeconv2d算子输入的pixel id和slice size,发现这里的点的位置不能对上。
就如上图,起始pixel id = 7, slice size = 5 , 推出的input pixel id = 4, slize size = 2

image 不太明白你是如何进行推算的,请参考上图y3对应的输入索引,希望能解答你的疑惑。

假设 TransposeConv2d 的kernel size = 3 ,stride = 2, padding = 0,out_padding = 0 ,dilation = 1, input_feature_map_h = 24
out_idx = 7, out_slice = 6, 按照代码中的逻辑推算出input h_idx = 3, input h_slice = 4,然后使用TransposeConv2d的计算公式正推output feature 的slice = (4 - 1) * 2 + 0 + 1 * (3 - 1) + 1 = 9 与之前给定的out_slice的值对不上

torch官网里的公式这里不能直接套用,因为套用它的前提是你的input shape为4,先看套用这个公式实际的计算流程,按你提供的参数,在input的左右都会pad 2,input展开后,即(0,0,i0,0,i1,... , 0, i3, 0, 0),卷积计算后out_shape是9。在看 backwardsH在算什么,backwards计算的是一个中间态,寻找的是out_idx, out_slice需要input中哪些部分参与运算,当out_idx = 7, out_slice = 6的时候实际参与计算的input展开后是(0, i3,0,i4,..., 0, i6),如果这里的代码比较难理解可以尝试通过绘图的方式进行辅助理解。

回到你最开始的问题“为什么采用的是向上取整呢”, 通过向上取整得到 real_in_idx,在pad_t中根据real_in_idx 反向计算,可以知道tilingx的头部需不需要进行pad。

image
对,但是我从code中只看到了计算pad_t的过程,并没有使用pad_t

image 对,但是我从code中只看到了计算pad_t的过程,并没有使用pad_t

后面下指令的时候会使用。

好的,明白了,非常感谢