yolov9
yolov9 copied to clipboard
RuntimeError: The size of tensor a (1024) must match the size of tensor b (128) at non-singleton dimension 1
I use train_dual.py with models/detect/yolov9-e.yaml
cfg file to train a model.
when i use tools/reparameterization.ipynb
sample, it occurred a runtime error: RuntimeError: The size of tensor a (1024) must match the size of tensor b (128) at non-singleton dimension 1
.
Please help me. How to solve it? What did I do wrong?
My code is follow :
import torch
import os, sys
sys.path.insert(0, os.getcwd())
from models.yolo import Model
cfg = "./models/detect/yolov9-e.yaml"
model = Model(cfg, ch=3, nc=18, anchors=3)
#model = model.half()
device = torch.device("cpu")
model = model.to(device)
_ = model.eval()
ckpt = torch.load('runs/train/yolov9-e_0417/weights/best.pt', map_location='cpu')
model.names = ckpt['model'].names
model.nc = ckpt['model'].yaml["nc"]
idx = 0
for k, v in model.state_dict().items():
if "model.{}.".format(idx) in k:
if idx < 29:
kr = k.replace("model.{}.".format(idx), "model.{}.".format(idx))
model.state_dict()[k] -= model.state_dict()[k]
model.state_dict()[k] += ckpt['model'].state_dict()[kr]
print(k, "perfectly matched!!")
elif idx < 42:
kr = k.replace("model.{}.".format(idx), "model.{}.".format(idx+7))
model.state_dict()[k] -= model.state_dict()[k]
model.state_dict()[k] += ckpt['model'].state_dict()[kr]
print(k, "perfectly matched!!")
elif "model.{}.cv2.".format(idx) in k:
kr = k.replace("model.{}.cv2.".format(idx), "model.{}.cv4.".format(idx+7))
model.state_dict()[k] -= model.state_dict()[k]
model.state_dict()[k] += ckpt['model'].state_dict()[kr]
print(k, "perfectly matched!!")
elif "model.{}.cv3.".format(idx) in k:
kr = k.replace("model.{}.cv3.".format(idx), "model.{}.cv5.".format(idx+7))
model.state_dict()[k] -= model.state_dict()[k]
model.state_dict()[k] += ckpt['model'].state_dict()[kr]
print(k, "perfectly matched!!")
elif "model.{}.dfl.".format(idx) in k:
kr = k.replace("model.{}.dfl.".format(idx), "model.{}.dfl2.".format(idx+7))
model.state_dict()[k] -= model.state_dict()[k]
model.state_dict()[k] += ckpt['model'].state_dict()[kr]
print(k, "perfectly matched!!")
else:
while True:
idx += 1
if "model.{}.".format(idx) in k:
break
if idx < 29:
kr = k.replace("model.{}.".format(idx), "model.{}.".format(idx))
model.state_dict()[k] -= model.state_dict()[k]
model.state_dict()[k] += ckpt['model'].state_dict()[kr]
print(k, "perfectly matched!!")
elif idx < 42:
kr = k.replace("model.{}.".format(idx), "model.{}.".format(idx+7))
model.state_dict()[k] -= model.state_dict()[k]
model.state_dict()[k] += ckpt['model'].state_dict()[kr]
print(k, "perfectly matched!!")
elif "model.{}.cv2.".format(idx) in k:
kr = k.replace("model.{}.cv2.".format(idx), "model.{}.cv4.".format(idx+7))
model.state_dict()[k] -= model.state_dict()[k]
model.state_dict()[k] += ckpt['model'].state_dict()[kr]
print(k, "perfectly matched!!")
elif "model.{}.cv3.".format(idx) in k:
kr = k.replace("model.{}.cv3.".format(idx), "model.{}.cv5.".format(idx+7))
model.state_dict()[k] -= model.state_dict()[k]
model.state_dict()[k] += ckpt['model'].state_dict()[kr]
print(k, "perfectly matched!!")
elif "model.{}.dfl.".format(idx) in k:
kr = k.replace("model.{}.dfl.".format(idx), "model.{}.dfl2.".format(idx+7))
model.state_dict()[k] -= model.state_dict()[k]
model.state_dict()[k] += ckpt['model'].state_dict()[kr]
print(k, "perfectly matched!!")
_ = model.eval()
m_ckpt = {'model': model.half(),
'optimizer': None,
'best_fitness': None,
'ema': None,
'updates': None,
'opt': None,
'git': None,
'date': None,
'epoch': -1}
torch.save(m_ckpt, "runs/train/yolov9-e_0417/weights/best_converted.pt")
the error:
Did you solve this issue @mizhitian-xiaomi ?
I use train_dual.py with
models/detect/yolov9-e.yaml
cfg file to train a model. when i usetools/reparameterization.ipynb
sample, it occurred a runtime error:RuntimeError: The size of tensor a (1024) must match the size of tensor b (128) at non-singleton dimension 1
. Please help me. How to solve it? What did I do wrong?My code is follow :
import torch import os, sys sys.path.insert(0, os.getcwd()) from models.yolo import Model cfg = "./models/detect/yolov9-e.yaml" model = Model(cfg, ch=3, nc=18, anchors=3) #model = model.half() device = torch.device("cpu") model = model.to(device) _ = model.eval() ckpt = torch.load('runs/train/yolov9-e_0417/weights/best.pt', map_location='cpu') model.names = ckpt['model'].names model.nc = ckpt['model'].yaml["nc"] idx = 0 for k, v in model.state_dict().items(): if "model.{}.".format(idx) in k: if idx < 29: kr = k.replace("model.{}.".format(idx), "model.{}.".format(idx)) model.state_dict()[k] -= model.state_dict()[k] model.state_dict()[k] += ckpt['model'].state_dict()[kr] print(k, "perfectly matched!!") elif idx < 42: kr = k.replace("model.{}.".format(idx), "model.{}.".format(idx+7)) model.state_dict()[k] -= model.state_dict()[k] model.state_dict()[k] += ckpt['model'].state_dict()[kr] print(k, "perfectly matched!!") elif "model.{}.cv2.".format(idx) in k: kr = k.replace("model.{}.cv2.".format(idx), "model.{}.cv4.".format(idx+7)) model.state_dict()[k] -= model.state_dict()[k] model.state_dict()[k] += ckpt['model'].state_dict()[kr] print(k, "perfectly matched!!") elif "model.{}.cv3.".format(idx) in k: kr = k.replace("model.{}.cv3.".format(idx), "model.{}.cv5.".format(idx+7)) model.state_dict()[k] -= model.state_dict()[k] model.state_dict()[k] += ckpt['model'].state_dict()[kr] print(k, "perfectly matched!!") elif "model.{}.dfl.".format(idx) in k: kr = k.replace("model.{}.dfl.".format(idx), "model.{}.dfl2.".format(idx+7)) model.state_dict()[k] -= model.state_dict()[k] model.state_dict()[k] += ckpt['model'].state_dict()[kr] print(k, "perfectly matched!!") else: while True: idx += 1 if "model.{}.".format(idx) in k: break if idx < 29: kr = k.replace("model.{}.".format(idx), "model.{}.".format(idx)) model.state_dict()[k] -= model.state_dict()[k] model.state_dict()[k] += ckpt['model'].state_dict()[kr] print(k, "perfectly matched!!") elif idx < 42: kr = k.replace("model.{}.".format(idx), "model.{}.".format(idx+7)) model.state_dict()[k] -= model.state_dict()[k] model.state_dict()[k] += ckpt['model'].state_dict()[kr] print(k, "perfectly matched!!") elif "model.{}.cv2.".format(idx) in k: kr = k.replace("model.{}.cv2.".format(idx), "model.{}.cv4.".format(idx+7)) model.state_dict()[k] -= model.state_dict()[k] model.state_dict()[k] += ckpt['model'].state_dict()[kr] print(k, "perfectly matched!!") elif "model.{}.cv3.".format(idx) in k: kr = k.replace("model.{}.cv3.".format(idx), "model.{}.cv5.".format(idx+7)) model.state_dict()[k] -= model.state_dict()[k] model.state_dict()[k] += ckpt['model'].state_dict()[kr] print(k, "perfectly matched!!") elif "model.{}.dfl.".format(idx) in k: kr = k.replace("model.{}.dfl.".format(idx), "model.{}.dfl2.".format(idx+7)) model.state_dict()[k] -= model.state_dict()[k] model.state_dict()[k] += ckpt['model'].state_dict()[kr] print(k, "perfectly matched!!") _ = model.eval() m_ckpt = {'model': model.half(), 'optimizer': None, 'best_fitness': None, 'ema': None, 'updates': None, 'opt': None, 'git': None, 'date': None, 'epoch': -1} torch.save(m_ckpt, "runs/train/yolov9-e_0417/weights/best_converted.pt")
the error:
You should use the gelan-e.yaml for the configuration of converting yolov9-e. So it's must be cfg = "./models/detect/gelan-e.yaml"