You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ELM视频质量预测模型的Pickle保存与加载代码求助

用Pickle保存和加载极限学习机(ELM)视频质量预测模型

下面是整合了Pickle模型保存与加载功能的完整代码,包含训练、保存、加载及预测全流程:

import numpy as np
from sklearn.preprocessing import MinMaxScaler
from numpy.linalg import pinv2
import pickle

# 假设train和test是已加载的数据集
scaler_X = MinMaxScaler()
scaler_Y = MinMaxScaler()

# 训练数据标准化
X_train = scaler_X.fit_transform(train.values[:,:-1])
y_train = scaler_Y.fit_transform(train.values[:,-1:])

# 测试数据标准化(仅用训练集的scaler)
X_test = scaler_X.transform(test.values[:,:-1])
y_test = scaler_Y.transform(test.values[:,-1:])

input_size = X_train.shape[1]

# 模型参数设置
hidden_size = 26
seed = 26
np.random.seed(seed)

# 初始化输入权重和偏置
input_weights = np.random.normal(size=[input_size, hidden_size])
biases = np.random.normal(size=[hidden_size])

# 激活函数
def relu(x):
    return np.maximum(x, 0, x)

# 计算隐含层输出
def hidden_nodes(X):
    G = np.dot(X, input_weights)
    G = G + biases
    H = relu(G)
    return H

# 计算输出权重
output_weights = np.dot(pinv2(hidden_nodes(X_train)), y_train)

# 预测函数
def predict(X):
    out = hidden_nodes(X)
    out = np.dot(out, output_weights)
    return out

# 测试集预测
prediction = predict(X_test)
# 方式1:用scaler反归一化(推荐)
unscaler_prediction = scaler_Y.inverse_transform(prediction)
unscaler_y_test = scaler_Y.inverse_transform(y_test)
# 方式2:手动反归一化(保留原代码逻辑)
# unscaler_prediction = prediction*(5-1)+1
# unscaler_y_test = y_test*(5-1)+1

# -------------------------- 模型保存 --------------------------
# 打包需要保存的组件:标准化器、模型参数
model_components = {
    'scaler_X': scaler_X,
    'scaler_Y': scaler_Y,
    'input_weights': input_weights,
    'biases': biases,
    'output_weights': output_weights,
    'hidden_size': hidden_size
}

# 保存到本地文件
with open('elm_video_quality_model.pkl', 'wb') as f:
    pickle.dump(model_components, f)

# -------------------------- 模型加载与预测 --------------------------
# 加载保存的模型
with open('elm_video_quality_model.pkl', 'rb') as f:
    loaded_model = pickle.load(f)

# 提取加载的组件
scaler_X_loaded = loaded_model['scaler_X']
scaler_Y_loaded = loaded_model['scaler_Y']
input_weights_loaded = loaded_model['input_weights']
biases_loaded = loaded_model['biases']
output_weights_loaded = loaded_model['output_weights']

# 重新定义依赖函数(也可将函数存入模型,重新定义更稳妥)
def relu_loaded(x):
    return np.maximum(x, 0, x)

def hidden_nodes_loaded(X):
    G = np.dot(X, input_weights_loaded)
    G = G + biases_loaded
    H = relu_loaded(G)
    return H

def predict_loaded(X):
    out = hidden_nodes_loaded(X)
    out = np.dot(out, output_weights_loaded)
    return out

# 示例:用加载的模型预测新数据
# 假设new_data是新的输入特征(需与训练集特征维度一致)
# new_data = ... 
new_data_scaled = scaler_X_loaded.transform(new_data)
new_pred_scaled = predict_loaded(new_data_scaled)
new_pred = scaler_Y_loaded.inverse_transform(new_pred_scaled)

关键说明

  • 保存内容:必须保存数据标准化器(scaler_X、scaler_Y)和ELM的核心参数(输入权重、偏置、输出权重),确保预测时的输入处理和模型计算与训练阶段一致。
  • 加载后使用:加载模型后需重新定义激活函数和计算函数,或直接将函数存入Pickle文件(但重新定义可避免函数序列化的潜在问题)。
  • 安全提示:仅加载来自可信来源的Pickle文件,避免执行恶意代码。

内容的提问来源于stack exchange,提问作者sera

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:25:19