Bootstrap

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"\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实战技巧。

;