Python 现代开发学习笔记

(三十)回归推理与输入尺度还原

# 项目文件: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 接近。

输入三十五和三按检查点中训练统计量转换,模型输出标准化页数,再乘目标标准差加均值,得到约八十四点零一一页

笔记正文与全部题解 · Ctrl / ⌘ K