您现在的位置是:首页 >技术交流 >TensorFlow 示例平方米转亩(二)网站首页技术交流
TensorFlow 示例平方米转亩(二)
                简介TensorFlow 示例平方米转亩(二)            
            一 训练结果
 
二 完整代码
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"
实际训练轮次: {len(history.history['loss'])}")
print(f"学习权重: {w_actual:.6f} (理论值: 0.0015)")
# 7. 预测验证
print("
预测结果对比:")
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.0 | 0.0225 | 0.0225 | 0.0000 | 
| 300.0 | 0.4500 | 0.4499 | -0.0001 | 
| 666.7 | 1.0000 | 0.9997 | -0.0003 | 
| 1000.0 | 1.5000 | 1.4995 | -0.0005 | 
四、优化建议
-  
工业级部署:
-  
直接使用公式
亩 = 平方米 × 0.0015,无需模型推理(避免计算资源浪费)。 
 -  
 -  
模型扩展性验证:
-  
添加噪声数据测试鲁棒性,验证模型是否过拟合完美数据。
 
 -  
 -  
量化训练:
-  
使用
tf.float16加速训练,测试低精度下的收敛稳定性。 
 -  
 
结论
本项目通过 数据预处理、模型结构优化 和 训练策略调整,成功实现了一个轻量级的高精度单位换算模型。其核心价值在于验证了深度学习在简单线性问题中的可行性,并为复杂模型调试提供了方法论参考。最终模型可作为教学案例,展示线性回归的基本原理与TensorFlow实战技巧。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。
        
    
        
    
            




U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结