reshape维度限制

您好,我在使用YOLOv3进行目标检测的时候遇到了问题,就是在detect前向的部分有一个4维的x[i](batch,_,ny,nx)转5维(bs,anchors,outputs,ny,nx)的reshape操作,但是我们要求在部署的时候只能支持最高4维的reshape,这样应该如何修改代码呢? 是否应该连同detect和后面的nms都处理成4维?源代码如下

def forward(self, x) :
    z = [] # inference output
    for i in range(self.nl):
        x[i] = self.m[i](x[il) # conv
        bs,_,ny, nx = x[il.shape # x(bs,255,20,20) to x(bs,3,20,20,85)
        x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 34, 2).contiguous()

我之前尝试对x[i][j]进行reshape(3维转4维),但是不知道是否因为不能对tensor内部进行reshape操作,这样会报错
代码:

for j in range(bs) :
    x[i][j]=x[i]lj].view(self.na, self.no, ny,nx).permute(0,2,3,1).contiguous()

报错:
runtime error:expand(torch.FloatTensor{[3,40,40,50]},size=[150,40,40]):the number of sizes provided (3) must be greater or equal to the number of dimensions in the tensor (4)

你是需要导出的onnx变成4维的吗还是pt就得是4维的?你这里改的话,如果部署用的是detect.py,运行就会出问题,因为forward下面的代码是需要这个五维的。如果你是导出onnx用别的去部署,那么学它的view的写法,直接改成下面的,至于维度数,你可以自己改成想要的shape,但是需要记住的是,这些维度的总和要保持不变,不然就会报维度不匹配的错误,然后导出onnx,但是记得训练和运行detect.py的时候是需要改回来的,不然会报错,这个修改仅限于导出onnx的时候修改onnx的输出shape。

 x[i] = x[i].view(bs, self.na*self.no, ny, nx).contiguous()

你可以参考下我之前对于yolov5旧版本的修改,之前旧版本也是5个输出,我这里是改成了2个维度,你可以换成上面的代码就是4个维度