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
相关产品推荐
相关产品推荐

