我是一名研究员,想要将 YOLOv5 当前的 backbon 从 darknet 更改为 resnet,因为我在 commons.py 中添加了这两个类。 在 Yolo.py 中添加 Maxpooling2D 和 Resblock 类名后出现此形状错误 发生此错误后,模型摘要成功打印在屏幕上。
# MaxPooling2D layer with args(kernel, stride, padding)
def __init__(self, k=2, s=2, p=0):
super().__init__()
self.maxpool = nn.MaxPool2d(k, s, p)
def forward(self, x):
return self.maxpool(x)
class ResBlock(nn.Module):
def __init__(self, c1, num_repeats):
super().__init__()
self.blocks = nn.Sequential(*[
nn.Identity() if i == 0 else Conv(c1, c1, k=3, s=1, act=True) for i in range(num_repeats)
])
def forward(self, x):
return torch.cat(x, self.blocks(x))
#Backbone
backbone: [
[-1, 1, "Conv", [64, 6, 2, 2]], # 0 - Conv1
[-1, 1, "MaxPooling2D", [3, 2]], # 1 - MaxPool
[-1, 3, "ResBlock", [64]], # 2 - Res2a, Res2b, Res2c
[-1, 1, "Conv", [128, 3, 2]], # 3 - Conv3
[-1, 4, "ResBlock", [128]], # 4 - Res3a, Res3b, Res3c, Res3d
[-1, 1, "Conv", [256, 3, 2]], # 5 - Conv4
[-1, 6, "ResBlock", [256]], # 6 - Res4a, Res4b, Res4c, Res4d, Res4e, Res4f
[-1, 1, "Conv", [512, 3, 2]], # 7 - Conv5
[-1, 3, "ResBlock", [512]], # 8 - Res5a, Res5b, Res5c
[-1, 1, "SPPF", [1024, 5]] # 9 - SPPF
]
Traceback (most recent call last):
File "train.py", line 647, in <module>
main(opt)
File "train.py", line 536, in main
train(opt.hyp, opt, device, callbacks)
File "train.py", line 130, in train
model = Model(cfg or ckpt['model'].yaml, ch=3, nc=nc, anchors=hyp.get('anchors')).to(device) # create
File "/home/dev/Documents/yolov5/models/yolo.py", line 195, in __init__
m.stride = torch.tensor([s / x.shape[-2] for x in forward(torch.zeros(1, ch, s, s))]) # forward
File "/home/dev/Documents/yolov5/models/yolo.py", line 194, in <lambda>
forward = lambda x: self.forward(x)[0] if isinstance(m, Segment) else self.forward(x)
File "/home/dev/Documents/yolov5/models/yolo.py", line 209, in forward
return self._forward_once(x, profile, visualize) # single-scale inference, train
File "/home/dev/Documents/yolov5/models/yolo.py", line 121, in _forward_once
x = m(x) # run
File "/home/dev/Documents/yolov5/models/common.py", line 90, in forward
return torch.cat(x, self.blocks(x))
File "/home/dev/Documents/yolov5/models/common.py", line 68, in forward
return self.act(self.bn(self.conv(x)))
File "/home/dev/.cache/pypoetry/virtualenvs/yolov5-FT1Hnn5N-py3.8/lib/python3.8/site-packages/torch/nn/modules/module.py", line 1501, in _call_impl
return forward_call(*args, **kwargs)
File "/home/dev/.cache/pypoetry/virtualenvs/yolov5-FT1Hnn5N-py3.8/lib/python3.8/site-packages/torch/nn/modules/conv.py", line 463, in forward
return self._conv_forward(input, self.weight, self.bias)
RuntimeError: Given groups=1, weight of size [8, 8, 3, 3], expected input[1, 32, 13, 13] to have 8 channels, but got 32 channels instead```
也许尝试将 MaxPooling2D 的步幅设置为 1。
MaxPooling2D 类(nn.Module):
definit(自身,k=2,s=1,p=0):