EuroSAT 影像分类
使用迁移学习完成十类地表覆盖分类,自定义宏平均 F1,并以归一化混淆矩阵检查类间误差。
从遥感地表覆盖分类、CNN 解释到表格回归,完成三类常见机器学习任务的数据处理、训练、评估与结果解读链路。
这是一组课程与实践型建模任务:重点不是单一排行榜分数,而是理解从数据管道到模型解释的完整方法。
使用迁移学习完成十类地表覆盖分类,自定义宏平均 F1,并以归一化混淆矩阵检查类间误差。
将分类结果还原成空间热力图,观察模型判断图像时实际关注的区域。
把缺失值、类别编码、数值标准化与回归器收进同一 Pipeline,通过五折交叉验证评估泛化误差。
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 保存最佳验证权重;测试阶段输出按真实类别归一化的混淆矩阵。
遥感类别之间存在光谱与尺度相似性。宏平均 F1 给每个类别相同权重,混淆矩阵则能直接定位哪些类别容易相互误判。


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将图像 resize 为 224 × 224,应用 ImageNet preprocess_input,同时取 ResNet50 最后卷积层 conv5_block3_out 与最终预测。
使用 GradientTape 计算目标类别对特征图的梯度,经全局平均后作为通道权重,通过 ReLU 得到空间热力图。


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))替换无穷值、检查缺失,删除无意义的 Id 列;对 SalePrice 使用 log1p 缓解长尾分布。
数值变量用中位数填补并标准化;类别变量填补后 One-Hot 编码,全部收进统一 preprocessing pipeline。
以对数空间 RMSE 执行 5-fold CV,全量拟合后用 expm1 还原价格,再检查整体质量、居住面积、车库等特征的重要性。


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")tf.data 管道、迁移学习、指标自定义、混淆矩阵、交叉验证、特征重要性与卷积网络可解释性。
这些结果属于学习型实践,未把有限 epoch 的课程实验写成生产级模型;页面也不补造原材料未给出的准确率。
页面依据《Deep_Learning_张文天》中的 EuroSAT 与 Grad-CAM 代码/结果,并结合项目经历详解中的 XGBoost 建模记录整理。