fix(actpred): ONNX opset 升级 + NumPy 兼容 + 断点续训 + MobileNetV2 离线弹性
- export_onnx: opset 17→18,dynamic_axes 改 dynamic_shapes 消除弃用警告 - predict: action_stats 改为 torch tensor,消除 NumPy 2.0 __array_wrap__ 警告 - train/pretrain: 每 epoch 保存 last.pt,新增 --resume 断点续训练 - model: MobileNetEncoder 下载失败时回退到已缓存权重 - _set.sh: 安装时预缓存 MobileNetV2 权重,失败给出明确指引 - test: 新增 TestResumeCheckpoint(2 用例),总计 58 测试全绿
This commit is contained in:
1 parent
9fc3542771
commit
d17677bade
9 files changed
+183
-18
No files matched your search
+28
-1
@@ -216,12 +216,25 @@ def main():
|
||||
|
||||
best_val_loss = float("inf")
|
||||
patience_counter = 0
|
||||
start_epoch = 1
|
||||
best_path = os.path.join(cfg.train.checkpoint_dir, "pretrain_best.pt")
|
||||
inference_path = os.path.join(
|
||||
cfg.train.checkpoint_dir, "pretrain_best_inference.pt"
|
||||
)
|
||||
last_path = os.path.join(cfg.train.checkpoint_dir, "pretrain_last.pt")
|
||||
|
||||
for epoch in range(1, cfg.train.epochs + 1):
|
||||
if args.resume:
|
||||
resume_ckpt = torch.load(args.resume, map_location=device, weights_only=True)
|
||||
model.load_state_dict(resume_ckpt["model_state_dict"])
|
||||
optimizer.load_state_dict(resume_ckpt["optimizer_state_dict"])
|
||||
scheduler.load_state_dict(resume_ckpt["scheduler_state_dict"])
|
||||
start_epoch = resume_ckpt["epoch"] + 1
|
||||
best_val_loss = resume_ckpt.get("best_val_loss", float("inf"))
|
||||
patience_counter = resume_ckpt.get("patience_counter", 0)
|
||||
print(f"Resumed from {args.resume} at epoch {start_epoch} "
|
||||
f"(best_val_loss={best_val_loss:.6f})")
|
||||
|
||||
for epoch in range(start_epoch, cfg.train.epochs + 1):
|
||||
print(f"\nEpoch {epoch}/{cfg.train.epochs} "
|
||||
f"lr={optimizer.param_groups[0]['lr']:.6f}")
|
||||
train_loss = pretrain_one_epoch(
|
||||
@@ -262,6 +275,20 @@ def main():
|
||||
f"(patience={cfg.train.patience})")
|
||||
break
|
||||
|
||||
# 每 epoch 保存 last.pt,支持 --resume 断点续训练
|
||||
torch.save(
|
||||
{
|
||||
"epoch": epoch,
|
||||
"model_state_dict": model.state_dict(),
|
||||
"optimizer_state_dict": optimizer.state_dict(),
|
||||
"scheduler_state_dict": scheduler.state_dict(),
|
||||
"best_val_loss": best_val_loss,
|
||||
"patience_counter": patience_counter,
|
||||
"config": cfg.to_dict(),
|
||||
},
|
||||
last_path,
|
||||
)
|
||||
|
||||
print(f"\nPre-training done. Best val_loss={best_val_loss:.6f}")
|
||||
|
||||
if best_val_loss == float("inf"):
|
||||
|
||||
Reference in new issue
Block a user