(三十)回归推理与输入尺度还原
# 项目文件:training_project/src/readingtorch/predict.py
import math
import numpy as np
import torch
from .checkpoint import load_checkpoint
from .models import build_model
class Predictor:
def __init__(self, checkpoint, device="cpu"):
self.saved = load_checkpoint(checkpoint)
self.device = torch.device(device)
self.model = build_model(self.saved["task"]).to(self.device)
self.model.load_state_dict(self.saved["model"])
self.model.eval() # 关闭 Dropout 的随机丢弃,再关闭后续梯度记录。
def pages(self, minutes, sessions):
if self.saved["task"] != "regression":
raise ValueError("这份检查点用于图形分类")
if not all(math.isfinite(value) and value > 0 for value in [minutes, sessions]):
raise ValueError("分钟数与次数应为正数")
pre = self.saved["preprocess"]
x = torch.tensor([[minutes, sessions]], dtype=torch.float32)
x = ((x - pre["x_mean"]) / pre["x_scale"]).to(self.device)
with torch.inference_mode():
result = self.model(x).cpu() * pre["y_scale"] + pre["y_mean"]
return result.item()Predictor 一次读取检查点并建立模型,调用 eval()。预测时把分钟数与次数排成 (1,2),减去保存的训练均值、除以训练尺度,在推理上下文中得到一个标准化结果。
最后执行“结果乘目标尺度、加目标均值”,还原为页数。训练采用了目标标准化,推理也就需要这一步;只保存权重而丢掉预处理,会让相同数字得到另一种含义。
本项目输入 35 分钟、3 次时,得到约 84.011 页,与自拟数据关系 2×35+3×3+5=84 接近。