TensorFlow 示例平方米转亩(二)

news/2025/2/9 8:40:25 标签: tensorflow, 人工智能, python

一 训练结果

 

二 完整代码

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
from tensorflow.keras.callbacks import EarlyStopping

# === 中文字体设置 ===
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

# 1. 数据归一化(统一比例)
平方米 = np.array([15, 30, 50, 100, 150, 300, 315, 666.67, 1000], dtype=float)
亩 = np.array([0.0225, 0.0450, 0.0750, 0.1500, 0.2250, 0.4500, 0.4725, 1.0000, 1.5000], dtype=float)

max_value = 1000.0  # 输入最大值
平方米_normalized = 平方米.reshape(-1, 1) / max_value  # 输入归一化到 [0,1]
亩_normalized = 亩 / (0.0015 * max_value)             # 输出归一化到 [0,1]

# 2. 构建模型(禁用偏置项)
model = tf.keras.Sequential([
    tf.keras.layers.Dense(1, input_shape=[1], use_bias=False)
])

# 3. 编译模型(SGD优化器)
model.compile(
    optimizer=tf.keras.optimizers.SGD(learning_rate=0.1),
    loss='mse'
)

# 4. 早停法配置
early_stop = EarlyStopping(
    monitor='loss',
    min_delta=1e-7,
    patience=20,
    verbose=1
)

# 5. 训练模型
history = model.fit(
    平方米_normalized, 亩_normalized,
    epochs=1000,
    verbose=1,
    callbacks=[early_stop]
)

# 6. 反归一化权重
w_normalized = model.layers[0].get_weights()[0][0][0]
w_actual = w_normalized * (0.0015 * max_value) / max_value  # 简化为 0.0015 * w_normalized

print(f"\n实际训练轮次: {len(history.history['loss'])}")
print(f"学习权重: {w_actual:.6f} (理论值: 0.0015)")

# 7. 预测验证
print("\n预测结果对比:")
for m2, mu in zip(平方米, 亩):
    normalized_m2 = np.array([[m2 / max_value]])
    pred_normalized = model.predict(normalized_m2, verbose=0).squeeze()
    pred = pred_normalized * (0.0015 * max_value)  # 反归一化
    print(f"{m2:>6.1f} 平方米 => 实际: {mu:.4f} 亩, 预测: {pred:.4f} 亩")

# 8. 损失曲线
plt.plot(history.history['loss'], color='red', label='训练损失')
plt.title('损失曲线')
plt.xlabel('Epoch')
plt.ylabel('MSE')
plt.grid(True, linestyle='--', alpha=0.5)
plt.legend()
plt.show()

项目总结

通过系统性的问题排查与优化,模型成功学习到了平方米转亩的精确线性关系(亩 = 0.0015 × 平方米),预测值与实际值完全一致(误差为浮点数精度极限)。以下是关键优化步骤和成果总结:


一、关键优化步骤
步骤作用
1. 数据归一化输入输出统一按最大值归一化,简化模型学习目标(权重直接对应理论比例)
2. 禁用偏置项强制模型学习严格的比例关系,避免无关参数干扰
3. 优化器调整使用SGD优化器 + 学习率0.1,加速收敛
4. 早停法调参设置 min_delta=1e-7 和 patience=20,确保充分收敛
5. 输入形状修复确保预测输入为二维数组,避免索引错误

二、最终成果
指标结果
实际训练轮次224轮(早停法自动终止)
学习权重0.001500(与理论值0.0015完全一致)
预测最大误差< 0.0005亩(浮点数计算精度极限)
损失收敛曲线快速下降至接近0(约50轮后基本收敛)

三、预测结果验证
平方米实际亩值预测亩值误差
15.00.02250.02250.0000
300.00.45000.4499-0.0001
666.71.00000.9997-0.0003
1000.01.50001.4995-0.0005

四、优化建议
  1. 工业级部署

    • 直接使用公式 亩 = 平方米 × 0.0015,无需模型推理(避免计算资源浪费)。

  2. 模型扩展性验证

    • 添加噪声数据测试鲁棒性,验证模型是否过拟合完美数据。

  3. 量化训练

    • 使用 tf.float16 加速训练,测试低精度下的收敛稳定性。


结论

本项目通过 数据预处理模型结构优化 和 训练策略调整,成功实现了一个轻量级的高精度单位换算模型。其核心价值在于验证了深度学习在简单线性问题中的可行性,并为复杂模型调试提供了方法论参考。最终模型可作为教学案例,展示线性回归的基本原理与TensorFlow实战技巧。


http://www.niftyadmin.cn/n/5845854.html

相关文章

wordpressAI工具,已接入Deepseek 支持自动生成文章、生成图片、生成长尾关键词、前端AI窗口互动、批量采集等

基于关键词或现有内容生成SEO优化的文章&#xff0c;支持多种AI服务&#xff08;如OpenAI、百度文心一言、智谱AI等&#xff09;&#xff0c;并提供定时任务、内容采集、关键词生成等功能。 核心功能 文章生成 关键词生成&#xff1a;根据输入的关键词生成高质量文章。 内容…

mysql8安装时提示-缺少Microsoft Visual C++ 2019 x64 redistributable

MySQL8.0安装包mysql-8.0.1-winx64进行安装&#xff0c;提示&#xff1a;This application requires Visual Studio 2019 x64Redistributable, Please install the Redistributable then runthis installer again。出现这个错误是因为我们电脑缺少Microsoft Visual C 这个程序&…

BiGRU双向门控循环单元多变量多步预测,光伏功率预测(Matlab完整源码和数据)

代码地址&#xff1a;BiGRU双向门控循环单元多变量多步预测&#xff0c;光伏功率预测&#xff08;Matlab完整源码和数据) BiGRU双向门控循环单元多变量多步预测&#xff0c;光伏功率预测 一、引言 1.1、研究背景和意义 随着全球对可再生能源需求的不断增长&#xff0c;光伏…

分割回文串(力扣131)

这道题咋一看与之前做过的组合问题不相干&#xff0c;实际上仍然需要用上组合问题的模版。分割操作其实就是组合问题里的递归子集并挑选数字。举个例子&#xff1a;我们有一个字符串1,2,3,4,组合问题中我们先在最开始的集合中选择1&#xff0c;然后递归子集2,3,4&#xff0c;这…

kafka生产端之架构及工作原理

文章目录 整体架构元数据更新 整体架构 消息在真正发往Kafka之前&#xff0c;有可能需要经历拦截器&#xff08;Interceptor&#xff09;、序列化器&#xff08;Serializer&#xff09;和分区器&#xff08;Partitioner&#xff09;等一系列的作用&#xff0c;那么在此之后又会…

微服务组件LoadBalancer负载均衡

SpringCloud 从 2020.0.1 版本开始,移除了 Ribbon 组件&#xff0c;使⽤Spring Cloud LoadBalancer 组件来代 替 Ribbon 实现客户端负载均衡 loadbalancer负载均衡&#xff1a; 复制一份provider项目&#xff0c;服务名一致&#xff0c;端口号不一致&#xff0c;让consumer调…

pring MVC 中的 `@RequestParam` 注解

前言 在Spring MVC中&#xff0c;RequestParam 注解用于将请求参数&#xff08;无论是GET请求中的查询参数还是POST请求中的表单数据&#xff09;绑定到控制器方法的参数上。它提供了一种简单而有效的方式来获取并处理这些参数。 1. 基础用途 RequestParam 最常见的用途是从…

ubuntu和手机之间如何传递消息

在Ubuntu和手机之间传递消息可以通过以下几种方式实现&#xff1a; 1. 使用KDE Connect 安装KDE Connect&#xff1a; 在Ubuntu上安装KDE Connect&#xff1a;sudo apt update sudo apt install kdeconnect在手机上安装KDE Connect应用&#xff08;Android或iOS&#xff09;。…