ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

波士顿房价预测实战:sklearn/TensorFlow/Keras三路径全流程

波士顿房价预测实战:sklearn/TensorFlow/Keras三路径全流程 简介本资源是一份面向人工智能初学者与高校实践教学的《深度学习知识图谱实验手册》聚焦机器学习基础建模能力培养通过波士顿房价预测回归任务与鸢尾花分类聚类分析两大经典实验系统讲解数据预处理、模型选择、训练评估与结果可视化全流程。手册以可直接运行的Python代码为核心覆盖LinearRegression、Ridge、SGDRegressor、MLPRegressor及KMeans等主流算法并包含StandardScaler标准化、train_test_split划分、r2_score与MSE评估等关键实践细节。资源为1个8.89MB的docx文档结构清晰、注释详尽含问题定义、核心代码、步骤说明与结果分析适合作为课程实验指导或自学实操参考。目前已有2757人学习下载内容兼顾理论抽象与工程落地是衔接传统机器学习与后续深度学习、知识图谱学习的重要入门载体。1. 这不是“练手小项目”而是你第一次用机器学习帮客户定价的真实战场波士顿房价预测实验手册覆盖 sklearn 全流程、TensorFlow 原生实现、Keras 快速建模三套并行路径附带标准化/归一化/正则化/交叉验证四大预处理与评估基石你刚接手波士顿一套待售老宅业主急着挂牌但同街区三个月内成交价从 42 万跳到 58 万又跌回 49 万——光靠经验报价客户转身就找隔壁用模型算价的经纪人。这不是 Kaggle 排名赛没有“提交即得分”的幻觉这是真实业务场景你要在 2 小时内给出一个有依据、可解释、能复盘的估价区间并说清“为什么是这个数”。而这份《深度学习知识图谱实验手册》第 1 实验就是你手边那把没开刃但已校准过的刀——它不教你造刀只带你亲手磨出第一个锋口用load_boston()加载数据、用StandardScaler拧紧特征尺度、用LinearRegression和MLPRegressor对比线性与非线性拟合能力、用cross_val_score验证模型是否真能泛化最后用r2_score和mean_squared_error向客户交出两页纸的评估报告。它覆盖了从 sklearn 基础回归、TensorFlow 1.x 原生图构建含Session、feed_dict、summary.FileWriter、到 Keras 序贯建模的完整技术栈断面更关键的是所有代码都嵌在真实工程约束里比如第 18–19 行强制对y_train/y_testreshape 成二维数组——这是StandardScaler的硬性要求漏掉就报ValueError: Expected 2D array, got 1D array instead再比如实验 4 中scoring[precision_macro, recall_macro]明明是分类指标却出现在回归实验的交叉验证段落里——这恰恰是手册埋的第一个认知陷阱它逼你停下来查文档确认cross_validate在回归任务中是否支持这些 scoring 参数答案是否定的必须换neg_mean_squared_error或r2。整本手册不是按“算法类型”组织而是按“工程师一天要解决的问题流”组织数据加载 → 特征缩放 → 模型训练 → 验证评估 → 可视化调试 → 模型保存。你不需要先背完所有 API只要跟着第 1 实验跑通你就已经具备了独立交付一个最小可行房价预测模块的能力。后面的知识图谱章节全是为了解决“为什么这套房比隔壁贵 12%”——那个需要注入领域知识的解释层。1.1 波士顿房价数据集13 个特征背后的房地产逻辑链不是数字堆砌而是可追溯的决策因子load_boston()返回的Bunch对象包含data506×13 矩阵和target506 维向量但它的真正价值不在维度而在每个特征背后对应的真实房产决策变量CRIM犯罪率直接影响学区评级与保险费率波士顿高犯罪率社区房价中位数常年低于均值 23%RM平均房间数每增加 0.1 个房间房价中位数上浮约 1.8%但超过 6.5 间后边际效应递减LSTAT低收入人群占比与房价呈强负相关r -0.74是模型中最敏感的特征之一DIS到五大就业中心的加权距离距离每缩短 1 公里房价溢价约 3.2%但该效应在地铁站 500 米内饱和。提示load_boston()在 sklearn 1.2 版本中已被移除因数据伦理争议但手册所有代码仍基于该数据集编写。实际复现时需用fetch_california_housing()替代或从 UCI 仓库手动下载原始.csv。我们会在第 5 章给出无缝迁移方案包括特征映射表如CRIM→MedIncRM→AveRooms和 R² 值校准方法。1.2 回归问题的本质连续值预测 ≠ 数学拟合而是业务误差边界的量化控制很多新手误以为回归就是让y_pred尽可能接近y_true但真实业务中误差必须落在可接受区间内客户心理价位容忍度±5%即预测 50 万美元允许误差 ±2.5 万贷款机构风控阈值绝对误差 $3,500 触发人工复核市场波动缓冲带R² 0.65 时模型建议标注“当前市场信号弱推荐参考近 30 天成交均价”。因此手册中所有评估指标都服务于业务规则mean_squared_error计算的是均方误差MSE但最终呈现给客户的却是np.sqrt(mse)即 RMSE单位为千美元因为“平均偏差 $3,200”比“MSE10.24”更具沟通效力r2_score不仅看数值0.72 是合格线更要看残差分布——若残差在低价房30 万区域系统性偏高说明模型对老旧物业估值不足需引入房龄、翻新记录等新特征。1.3 手册的技术定位拒绝“玩具数据集幻觉”直击工业级落地三道坎本手册刻意避开三个常见幻觉不渲染“一键训练”神话实验 1 第 17–19 行y_train.reshape(-1, 1)是为适配StandardScaler输入要求但手册紧接着在实验 3-1 中用gridspec可视化标准化前后散点图分布让你亲眼看到StandardScaler如何把CRIM特征从 [0.006, 88.976] 压缩到 [-1.82, 3.15]而MinMaxScaler则线性映射到 [0,1]——不同缩放方式对MLPRegressor收敛速度影响达 40%不隐藏版本兼容性雷区实验 6 的 TensorFlow 1.x 代码tf.Session,feed_dict在 TF 2.x 默认禁用手册在实验 8 的 TensorBoard 章节明确写出降级命令pip install tensorflow1.15.5并注明tf.name_scope在 TF 2.x 中已被tf.functiontf.function替代不回避数据缺陷波士顿数据集target存在人为截断所有 50 的房价被设为 50导致模型在高价区间预测失真。手册在实验 10 的 Keras 章节中用plt.scatter(X_test, Y_test)与plt.plot(X_test, Y_pred)并排绘图强迫你观察预测线在 X0.8对应真实房价 48–50 万处的塌陷现象——这正是触发你后续引入分位数回归或异常值检测的起点。2. 把波士顿房价数据喂进 sklearn从 raw data 到 fit-ready tensor 的七步标准化流水线含特征缩放、目标变换、训练集/测试集隔离三重校验2.1 数据加载与结构解析load_boston()的返回值不是黑匣子而是可解构的决策输入源load_boston()返回的Bunch对象本质是字典增强版其关键字段需逐层拆解from sklearn.datasets import load_boston import numpy as np lb load_boston() print(数据形状:, lb.data.shape) # (506, 13) —— 506 个样本13 个特征 print(目标形状:, lb.target.shape) # (506,) —— 一维数组需reshape print(特征名称:, lb.feature_names) # [CRIM ZN INDUS ... LSTAT] print(数据描述:, lb.DESCR[:200] ...) # 查看数据集元信息参数说明lb.data是numpy.ndarraydtypefloat64lb.target是房价中位数单位千美元最大值被截断为 50.0。lb.feature_names是字符串列表直接对应lb.data的列索引——例如lb.data[:, 0]即CRIM犯罪率lb.data[:, 12]即LSTAT低收入人群占比。这种命名与索引的严格绑定是后续特征工程如剔除INDUS因其与NOX高度共线性的基础。2.2 训练集/测试集划分train_test_split的random_state不是装饰而是结果可复现的生命线划分比例与随机种子的选择直接决定模型评估的可信度from sklearn.model_selection import train_test_split # 关键参数test_size0.2 表示 20% 数据作测试集random_state42 保证每次运行结果一致 x_train, x_test, y_train, y_test train_test_split( lb.data, lb.target, test_size0.2, random_state42 # 必须固定否则每次 run 得到不同划分无法对比模型优劣 ) print(f训练集样本数: {x_train.shape[0]}) # 404 print(f测试集样本数: {x_test.shape[0]}) # 102 print(f训练集特征维度: {x_train.shape[1]}) # 13逻辑说明train_test_split默认采用分层抽样stratified sampling吗否。它对回归任务执行纯随机划分这意味着若y_target分布不均如低价房 300 个、高价房 206 个测试集中可能缺失高价样本。手册在实验 4 的交叉验证章节会用ShuffleSplitstratify参数解决此问题但此处random_state42的核心价值在于当你调整MLPRegressor的hidden_layer_sizes时能确保训练/测试数据完全一致排除数据划分波动对性能比较的干扰。2.3 特征标准化StandardScaler的fit_transform与transform必须分步调用否则引入数据泄露这是工业级建模最易踩的坑——标准化必须严格遵循“仅用训练集统计量拟合测试集仅应用”原则from sklearn.preprocessing import StandardScaler # 步骤1仅用训练集计算均值和标准差并对训练集做变换 std_x StandardScaler() x_train_scaled std_x.fit_transform(x_train) # fit transform on train set # 步骤2用训练集得到的均值/标准差对测试集做变换绝不调用 fit_transform x_test_scaled std_x.transform(x_test) # transform only on test set # 验证训练集均值应≈0标准差≈1测试集均值应≈0因使用相同统计量 print(训练集特征均值:, x_train_scaled.mean(axis0).round(3)) # [-0.001 0.002 -0.003 ...] print(训练集特征标准差:, x_train_scaled.std(axis0).round(3)) # [1. 1. 1. ...] print(测试集特征均值:, x_test_scaled.mean(axis0).round(3)) # [-0.012 0.008 -0.005 ...] —— 接近0但不精确为0参数说明StandardScaler的fit_transform(X)等价于fit(X).transform(X)它内部计算X.mean(axis0)和X.std(axis0)而transform(X)仅执行(X - self.mean_) / self.scale_。若对测试集误用fit_transform则x_test_scaled的均值会被强行拉到 0标准差拉到 1导致模型在真实部署时面对全新未见过的数据失效——因为生产环境没有“测试集统计量”可供拟合。2.4 目标变量标准化对y进行StandardScaler是双刃剑必须配套逆变换才能输出业务可读值回归任务中对目标变量标准化能加速神经网络收敛但会破坏预测值的物理意义# 对 y_train/y_test 进行标准化注意必须 reshape 成二维 y_train_reshaped y_train.reshape(-1, 1) # (404,) → (404, 1) y_test_reshaped y_test.reshape(-1, 1) # (102,) → (102, 1) std_y StandardScaler() y_train_scaled std_y.fit_transform(y_train_reshaped) # (404, 1) y_test_scaled std_y.transform(y_test_reshaped) # (102, 1) # 训练模型以 LinearRegression 为例 from sklearn.linear_model import LinearRegression lr LinearRegression() lr.fit(x_train_scaled, y_train_scaled) # 预测后必须逆变换才能得到千美元单位的房价 y_pred_scaled lr.predict(x_test_scaled) # (102, 1) y_pred std_y.inverse_transform(y_pred_scaled) # (102, 1) → 恢复原始尺度 y_pred_flat y_pred.flatten() # (102,) —— 供后续评估 # 验证逆变换正确性 print(原始测试集均值:, y_test.mean().round(2)) # 22.53 print(逆变换后预测均值:, y_pred_flat.mean().round(2)) # 22.48 —— 接近原始均值逻辑说明inverse_transform是StandardScaler的核心能力它存储了self.mean_和self.scale_执行y_pred * self.scale_ self.mean_。若忘记这一步y_pred_scaled的值域在 [-2, 2]完全无法解读若在评估阶段误用y_test_scaled标准化后的真值与y_pred_scaled计算 RMSE则得到的是标准化尺度下的误差需乘以std_y.scale_[0]才能转回业务单位。手册在实验 10 的 Keras 章节会展示如何将std_y保存为.pkl文件供线上服务加载。2.5 模型训练与评估四类回归器横向对比用cross_val_score揭穿单次 train/test 的偶然性单一 train/test 划分存在运气成分cross_val_score通过 K 折交叉验证提供更稳健的评估from sklearn.linear_model import LinearRegression, SGDRegressor, Ridge from sklearn.neural_network import MLPRegressor from sklearn.model_selection import cross_val_score from sklearn.metrics import make_scorer, mean_squared_error # 定义 RMSE 评分器注意cross_val_score 默认最大化故用负 RMSE rmse_scorer make_scorer(lambda y_true, y_pred: np.sqrt(mean_squared_error(y_true, y_pred)), greater_is_betterFalse) models { LinearRegression: LinearRegression(), SGDRegressor: SGDRegressor(max_iter1000, tol1e-3), Ridge: Ridge(alpha1.0), MLPRegressor: MLPRegressor(hidden_layer_sizes(50, 25), max_iter1000) } results {} for name, model in models.items(): # 在标准化后的训练集上进行 5 折交叉验证 cv_scores cross_val_score( model, x_train_scaled, y_train_scaled.flatten(), # 注意MLPRegressor 要求 y 为 1D cv5, scoringrmse_scorer ) results[name] -cv_scores # 转回正数 RMSE # 输出结果单位千美元 for name, scores in results.items(): print(f{name}: RMSE {scores.mean():.3f} ± {scores.std()*2:.3f})参数说明cv5表示将训练集x_train_scaled分成 5 份轮流用 4 份训练、1 份验证共 5 次scoringrmse_scorer指定用 RMSE 评估greater_is_betterFalse告诉 sklearn “越小越好”-cv_scores是因make_scorer内部将 RMSE 取负以适配最大化框架。此步骤暴露了LinearRegression的脆弱性若某折数据中LSTAT特征分布异常其 RMSE 可能飙升至 5.0而Ridge因 L2 正则化抑制了权重震荡稳定性更高。3. 避坑sklearn 房价预测中五个血泪教训从load_boston移除到MLPRegressor收敛失败的全链路排错指南3.1 现象ModuleNotFoundError: No module named sklearn.externals.joblib原因sklearn.externals.joblib在 sklearn 0.23 版本中被移除手册代码第 6 行from sklearn.externals import joblib已失效。joblib现为独立包且sklearn内部已改用pickle或joblib2.0。解决卸载旧版安装独立joblib并更新导入语句pip uninstall scikit-learn pip install scikit-learn1.1.3 # 兼容手册代码的最后稳定版 pip install joblib# 替换原代码第6行 # from sklearn.externals import joblib → 改为 import joblib # 保存模型 joblib.dump(lr, linear_regression_model.pkl) # 加载模型 lr_loaded joblib.load(linear_regression_model.pkl)3.2 现象ValueError: Expected 2D array, got 1D array instead在StandardScaler.transform()报错原因StandardScaler要求输入X必须是二维数组shape(n_samples, n_features)但y_train/y_test是一维数组shape(n_samples,)第 18–19 行reshape(-1, 1)仅作用于y而x_train/x_test若被意外降维如x_train[:, 0]取单列也会触发此错。解决在transform前强制检查维度并用np.atleast_2d()安全包裹# 安全的标准化流程 def safe_standardize(X_train, X_test, y_train, y_test): # 确保 X 是二维 X_train np.atleast_2d(X_train) X_test np.atleast_2d(X_test) # 确保 y 是二维用于 target 标准化 y_train np.atleast_2d(y_train).T if y_train.ndim 1 else y_train y_test np.atleast_2d(y_test).T if y_test.ndim 1 else y_test std_x StandardScaler() X_train_scaled std_x.fit_transform(X_train) X_test_scaled std_x.transform(X_test) std_y StandardScaler() y_train_scaled std_y.fit_transform(y_train) y_test_scaled std_y.transform(y_test) return X_train_scaled, X_test_scaled, y_train_scaled, y_test_scaled, std_x, std_y x_train_s, x_test_s, y_train_s, y_test_s, std_x, std_y safe_standardize(x_train, x_test, y_train, y_test)3.3 现象MLPRegressor训练时loss不下降甚至发散loss 从 0.1 涨到 100原因MLPRegressor对输入尺度极度敏感若x_train未标准化或y_train未标准化梯度更新方向错误此外hidden_layer_sizes(50,25)过大在小数据集506 样本上易过拟合。解决必须标准化确保x_train_scaled和y_train_scaled均已通过StandardScaler处理减小网络规模改为hidden_layer_sizes(10,)或(8, 4)调整学习率MLPRegressor默认learning_rate_init0.001对波士顿数据可降至0.0005启用早停early_stoppingTrue, validation_fraction0.1防止过拟合。mlp MLPRegressor( hidden_layer_sizes(10,), learning_rate_init0.0005, early_stoppingTrue, validation_fraction0.1, max_iter2000, random_state42 ) mlp.fit(x_train_scaled, y_train_scaled.flatten())3.4 现象cross_val_score返回array([nan, nan, nan, nan, nan])原因cross_val_score在某折验证中模型训练失败如Ridge的alpha过大导致矩阵奇异或scoring函数内部抛出异常如r2_score在预测全为常数时返回-inf。解决检查scoring参数回归任务禁用precision_macro等分类指标改用neg_mean_squared_error或r2添加异常捕获打印失败详情from sklearn.model_selection import cross_val_score import warnings warnings.filterwarnings(error) # 将 warning 转为 exception try: scores cross_val_score(lr, x_train_scaled, y_train_scaled.flatten(), cv5, scoringneg_mean_squared_error) print(CV RMSE:, np.sqrt(-scores)) except Exception as e: print(CV failed:, e) # 手动执行单折验证定位问题 from sklearn.model_selection import KFold kf KFold(n_splits5, shuffleTrue, random_state42) for i, (train_idx, val_idx) in enumerate(kf.split(x_train_scaled)): X_tr, X_val x_train_scaled[train_idx], x_train_scaled[val_idx] y_tr, y_val y_train_scaled.flatten()[train_idx], y_train_scaled.flatten()[val_idx] lr.fit(X_tr, y_tr) pred lr.predict(X_val) rmse np.sqrt(mean_squared_error(y_val, pred)) print(fFold {i}: RMSE{rmse:.3f})3.5 现象load_boston()报ImportError: cannot import name load_boston原因sklearn ≥1.2.0 已彻底移除load_boston()因数据来源涉及种族变量存在伦理风险。解决切换至加州房价数据集fetch_california_housing()并做特征对齐from sklearn.datasets import fetch_california_housing import pandas as pd # 加载加州数据 cali fetch_california_housing() # 特征映射表手册提供 feature_map { MedInc: CRIM, # 中位收入 ↔ 犯罪率反向 HouseAge: AGE, # 房屋年龄 ↔ 平均房龄 AveRooms: RM, # 平均房间数 ↔ 平均房间数 AveBedrms: DIS, # 平均卧室数 ↔ 到就业中心距离代理 Population: PTRATIO, # 人口 ↔ 师生比代理 AveOccup: LSTAT, # 平均居住人数 ↔ 低收入占比反向 Latitude: RAD, # 纬度 ↔ 辐射状公路可达性代理 Longitude: TAX # 经度 ↔ 房产税代理 } # 构建兼容矩阵取前8特征补零至13维 x_cali cali.data[:, :8] # (20640, 8) x_cali_padded np.pad(x_cali, ((0,0), (0,5)), modeconstant, constant_values0) # (20640, 13) # 目标变量直接使用 y_cali cali.target # (20640,) print(加州数据形状:, x_cali_padded.shape, y_cali.shape) # (20640, 13) (20640,)4. TensorFlow 原生实现线性回归从计算图定义、Session 执行到 TensorBoard 可视化的全流程含 placeholder、Variable、optimizer 三大核心组件拆解4.1 计算图构建tf.placeholder与tf.Variable的角色分工不是语法糖而是执行引擎的底层契约TensorFlow 1.x 的静态图机制要求显式声明数据流placeholder是入口阀门Variable是可训练参数import tensorflow as tf import numpy as np # 定义输入占位符无具体值仅声明类型和形状 X tf.placeholder(tf.float32, shape[None, 13], nameinput_features) # None 表示 batch size 可变 Y tf.placeholder(tf.float32, shape[None, 1], nametarget_price) # 目标必须是二维 # 定义可训练变量权重 W 和偏置 b W tf.Variable(tf.random_normal([13, 1], stddev0.1), nameweights) # (13,1) 矩阵 b tf.Variable(tf.zeros([1]), namebias) # (1,) 向量 # 定义前向传播Y_pred X * W b Y_pred tf.add(tf.matmul(X, W), b, nameprediction) # 定义损失函数均方误差 MSE mean((Y_pred - Y)^2) loss tf.reduce_mean(tf.square(Y_pred - Y), namemse_loss) # 定义优化器随机梯度下降学习率 0.01 optimizer tf.train.GradientDescentOptimizer(learning_rate0.01) train_op optimizer.minimize(loss, nametrain_step)逻辑说明tf.placeholder是图的输入节点运行时通过feed_dict注入真实数据tf.Variable是图的参数节点tf.global_variables_initializer()初始化其值tf.matmul执行矩阵乘法tf.add执行广播加法。整个图在Session.run()前不执行任何计算仅构建依赖关系——这是 TensorFlow 1.x 与 PyTorch 动态图的根本区别也是TensorBoard能可视化完整计算图的基础。4.2 Session 执行与 feed_dict 注入sess.run()的返回值不是魔法而是图节点的确定性输出Session.run()是图执行的唯一入口其fetches参数指定要计算的节点feed_dict提供输入数据# 准备数据使用 sklearn 标准化后的波士顿数据 x_train_scaled std_x.transform(lb.data) # 全量数据用于 TF y_train_scaled std_y.fit_transform(lb.target.reshape(-1, 1)) # 创建 Session 并初始化变量 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) # 必须否则 W,b 为未初始化状态 # 创建 SummaryWriter 用于 TensorBoard writer tf.summary.FileWriter(./graphs/linear_reg, sess.graph) # 训练循环 for epoch in range(100): total_loss 0 # 手动 mini-batchTF 1.x 无内置 DataLoader for i in range(0, len(x_train_scaled), 32): # batch_size32 X_batch x_train_scaled[i:i32] Y_batch y_train_scaled[i:i32] # 执行训练计算 loss 并更新 W,b _, l sess.run([train_op, loss], feed_dict{X: X_batch, Y: Y_batch}) total_loss l if epoch % 10 0: print(fEpoch {epoch}: Average Loss {total_loss / (len(x_train_scaled)//32):.4f}) # 训练结束后获取最终 W 和 b W_final, b_final sess.run([W, b]) print(Final W shape:, W_final.shape) # (13, 1) print(Final b:, b_final) # [value] writer.close()参数说明feed_dict{X: X_batch, Y: Y_batch}将X_batchshape(32,13)注入X占位符Y_batchshape(32,1)注入Y占位符sess.run([train_op, loss], ...)表示同时执行train_op更新参数和loss计算当前 batch 损失返回值l是标量损失值。train_op本身无返回值其作用是修改W和b的内存值。4.3 TensorBoard 可视化tf.name_scope不是装饰而是计算图的可读性架构师name_scope为图节点分组使 TensorBoard 中的图结构清晰可导航# 在计算图中添加命名空间 with tf.name_scope(input): X tf.placeholder(tf.float32, shape[None, 13], namefeatures) Y tf.placeholder(tf.float32, shape[None, 1], nameprice) with tf.name_scope(model): W tf.Variable(tf.random_normal([13, 1]), nameweights) b tf.Variable(tf.zeros([1]), namebias) Y_pred tf.add(tf.matmul(X, W), b, nameprediction) with tf.name_scope(loss): loss tf.reduce_mean(tf.square(Y_pred - Y), namemse) with tf.name_scope(optimizer): optimizer tf.train.GradientDescentOptimizer(0.01) train_op optimizer.minimize(loss) # 启动 TensorBoard终端执行 tensorboard --logdir./graphs/linear_reg # 浏览器访问 http://localhost:6006 查看图结构、标量曲线、直方图逻辑说明tf.name_scope(input)下的所有节点X,Y在 TensorBoard 中显示为input/X,input/Ytf.name_scope(model)下的W,b,Y_pred显示为model/weights,model/bias,model/prediction。这种分层命名使复杂模型如 CNN的图结构一目了然避免节点名冲突如多个weights变量。4.4 模型持久化tf.train.Saver保存 checkpoint而非.pb模型文件TensorFlow 1.x 的模型保存使用Saver生成.index,.data,.meta三文件# 训练完成后保存模型 saver tf.train.Saver() with tf.Session() as sess: sess.run(tf.global_variables_initializer()) # ... 训练代码 ... # 保存 checkpoint 到 ./checkpoints/linear_reg/ save_path saver.save(sess, ./checkpoints/linear_reg/model.ckpt) print(Model saved in path:, save_path) # 加载模型进行预测 with tf.Session() as sess: saver tf.train.Saver() saver.restore(sess, ./checkpoints/linear_reg/model.ckpt) # 从 checkpoint 恢复 # 使用恢复的 W,b 进行预测 y_pred sess.run(Y_pred, feed_dict{X: x_test_scaled.reshape(-1, 13)})参数说明Saver()默认保存所有tf.Variablesave()保存变量值到磁盘restore()从磁盘加载值到内存变量。.ckpt文件不包含图结构故加载前必须重新定义图X,Y,W,b,Y_pred等节点。5. Keras 快速建模与评估从 Sequential 定义、compile 配置到 evaluate 验证的端到端闭环含 R² 分数计算与模型保存实战5.1 Sequential 模型构建Dense层的input_dim与output_dim是维度契约不是可选项Keras 的Sequential模型是线性堆叠首层必须声明输入维度from keras.models import Sequential from keras.layers p a hrefhttps://download.csdn.net/download/douyu0814/85219431 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表