最近在跑改yolov5网络的时候,老碰到一个很奇怪的问题:就比如以加上一个ACmix模块为例,修改yolov5l.yaml文件,我在neck部分的初始加了一个ACmix模块,运行的时候跳了一个问题:
RuntimeError: Argument #4: Padding size should be less than the corresponding input dimension, but got: padding (3, 3) at dimension 3 of input 4
大概意思是说我这时候的特征太小了比3x3还小,因为这个模块有个torch.nn.ReflectionPad2d(3)的操作,即映射往周边填充3。
但也不对啊,按照网络的情况,进入ACmic模块的特征大小应该是(batch_size,1024,20,20)就是分辨率有20x20了,这问题有点奇怪,??于是我在ACmix的forward()方法中加入了一行代码,作用就是显示进入ACmix模块的特征分辨率:
print(x.shape)
结果显示:
torch.Size([1, 1024, 8, 8])
torch.Size([1, 1024, 1, 1])
预想是:torch.Size([1, 1024, 20, 20])
后面我发现运行yolo.py文件的时候,输入的图片大小是256,下采样32倍后就成了8了,但先不论为什么输入的图片大小不是640而是256,更让我疑惑的是我只在yolov5l.yaml里只用了一个ACmix模块,但这里却打印了两次???说明后面哪里又调用了这个模块,而且也不是inference阶段,模型Fuse之后再调用了ACmix的原因。。。。求求大神告知如何解决这个问题,
(之前再用阿里达摩院的P2T论文的时候也遇到过相似的问题,看了半天终于看懂了源代码,放到yolov5里就出问题了,原因也是说进入池化的分辨率太小,也用上面相似的方法发现它也是多次调用了模块(但明明我只设定用一次),但代码里也瞧不出问题)