张文天WENTIAN.XYZ
PROJECT / 02 · MACHINE LEARNING

机器学习与
深度学习视觉建模

从遥感地表覆盖分类、CNN 解释到表格回归,完成三类常见机器学习任务的数据处理、训练、评估与结果解读链路。

TensorFlow / KerasEfficientNetV2ResNet50Grad-CAMXGBoost

这是一组课程与实践型建模任务:重点不是单一排行榜分数,而是理解从数据管道到模型解释的完整方法。

3分类、解释、回归任务
10EuroSAT 地表覆盖类别
64训练 batch size
5-foldXGBoost 交叉验证

三个任务,一套可复用的建模逻辑

REMOTE SENSING

EuroSAT 影像分类

使用迁移学习完成十类地表覆盖分类,自定义宏平均 F1,并以归一化混淆矩阵检查类间误差。

EXPLAINABILITY

ResNet50 + Grad-CAM

将分类结果还原成空间热力图,观察模型判断图像时实际关注的区域。

REGRESSION

XGBoost 房价回归

把缺失值、类别编码、数值标准化与回归器收进同一 Pipeline,通过五折交叉验证评估泛化误差。

从 tf.data 到混淆矩阵

EuroSAT 数据按 60% / 20% / 20% 分为训练、测试和验证集。任务以 64 × 64 RGB 影像为输入,用 ImageNet 预训练 EfficientNetV2 提取特征。

数据管道

one-hot 标签后执行 shuffle、repeat、batch=64 和 AUTOTUNE prefetch,降低训练时 I/O 等待。

迁移学习

接入 EfficientNetV2 ImageNet1k L feature vector,后接十类 softmax 输出层,以 Adam 和交叉熵训练。

自定义指标

继承 Keras Metric,逐类累积 TP、FP、FN,计算 precision、recall 与 macro F1,并设置数值稳定项避免除零。

评估输出

ModelCheckpoint 保存最佳验证权重;测试阶段输出按真实类别归一化的混淆矩阵。

为什么不只看 accuracy?

遥感类别之间存在光谱与尺度相似性。宏平均 F1 给每个类别相同权重,混淆矩阵则能直接定位哪些类别容易相互误判。

60 / 20 / 20训练、测试、验证划分
0.88–1.00归一化混淆矩阵对角线区间
10 classes农业、森林、道路、水体等覆盖类型
EuroSAT 十类别归一化混淆矩阵
分类混淆矩阵Forest、Residential、River 与 Sea/Lake 对角值较高;PermanentCrop 与 HerbaceousVegetation 的混淆最值得继续检查。
EuroSAT 验证集样本与类别标签
验证样本用 4 × 4 样本板检查数据管道、标签映射与影像尺度是否一致。
TensorFlow · custom metric
def result(self):
  precision = tp / (tp + fp + 1e-7)
  recall = tp / (tp + fn + 1e-7)
  f1 = 2 * precision * recall / (precision + recall + 1e-7)
  return tf.reduce_mean(f1)  # macro F1

让分类结果可见

FORWARD

特征与预测

将图像 resize 为 224 × 224,应用 ImageNet preprocess_input,同时取 ResNet50 最后卷积层 conv5_block3_out 与最终预测。

BACKWARD

梯度加权

使用 GradientTape 计算目标类别对特征图的梯度,经全局平均后作为通道权重,通过 ReLU 得到空间热力图。

  • 可视化热力图缩放回原图尺寸,应用 VIRIDIS 色带。
  • 叠加以 alpha=0.4 与原图融合,保留场景纹理与关注区对照。
  • 用途检查模型是否关注了主体,还是被背景、边缘或其他偶然特征干扰。
ResNet50 对金毛犬图像生成的 Grad-CAM 热力图
Dog / Grad-CAM高响应集中在头部与前躯,说明模型关注区域与主体具有空间一致性。
ResNet50 对猫图像生成的 Grad-CAM 热力图
Cat / Grad-CAM热区覆盖面部与躯干,可用于核对模型是否依赖背景纹理。
ResNet50 · gradient attribution
with tf.GradientTape() as tape:
  conv, pred = grad_model(img_preprocessed)
  loss = pred[:, tf.argmax(pred[0])]
grads = tape.gradient(loss, conv)[0]
weights = tf.reduce_mean(grads, axis=(0, 1))
heatmap = tf.nn.relu(tf.reduce_sum(weights * conv[0], axis=-1))

结构化数据的回归实践

数据清理

INPUT

替换无穷值、检查缺失,删除无意义的 Id 列;对 SalePrice 使用 log1p 缓解长尾分布。

特征工程

PROCESS

数值变量用中位数填补并标准化;类别变量填补后 One-Hot 编码,全部收进统一 preprocessing pipeline。

验证与解读

OUTPUT

以对数空间 RMSE 执行 5-fold CV,全量拟合后用 expm1 还原价格,再检查整体质量、居住面积、车库等特征的重要性。

Kaggle 房价特征相关性矩阵
相关性检查在建模前识别目标变量与数值特征的关系,同时避免把相关性直接误当作因果。
XGBoost 房价回归前十项特征重要性
特征重要性OverallQual、ExterQual、GarageCars、CentralAir 与居住面积等变量进入前列。
scikit-learn · reproducible pipeline
preprocessor = ColumnTransformer([
  ("num", Pipeline([median_imputer, scaler]), numeric_cols),
  ("cat", Pipeline([mode_imputer, one_hot]), categorical_cols)
])
model = Pipeline([( "prep", preprocessor), ( "xgb", regressor)])
rmse = cross_val_score(model, X, y_log, cv=5, scoring="neg_root_mean_squared_error")

方法收获与项目边界

CAPABILITY

已形成的能力

tf.data 管道、迁移学习、指标自定义、混淆矩阵、交叉验证、特征重要性与卷积网络可解释性。

BOUNDARY

不过度声明

这些结果属于学习型实践,未把有限 epoch 的课程实验写成生产级模型;页面也不补造原材料未给出的准确率。

内容依据

页面依据《Deep_Learning_张文天》中的 EuroSAT 与 Grad-CAM 代码/结果,并结合项目经历详解中的 XGBoost 建模记录整理。