BackWardH
qiuliang1993 opened this issue · comments
hi,大佬,在感受野倒推时遇到TransPoseConv2d(上采样)算子时,当start idx 与感受野大小不能被2整除时,为什么采用的是向上取整呢?这样很容易出现位置对不上的情况
能详细说一下在什么情况下遇到的这个问题吗?这里的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
假设 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。
好的,明白了,非常感谢