使用Keras和TensorFlow进行航空影像分类:保存模型预测结果随机问题咨询
我太懂这种糟心的感觉了——花了好大力气训练好的航空影像分类模型,存成h5格式后用来预测新区域,结果每次跑出来的预测结果都不一样,完全没个准数。结合你用256×256切片、Sequential模型加ImageDataGenerator的场景,我整理了几个最可能的诱因和对应的解决办法:
全局随机种子没固定
TensorFlow和Keras里从权重初始化、数据增强到Dropout层的操作,很多都依赖随机数生成。如果没在代码最开头就把所有相关的随机种子固定死,每次运行程序时这些随机操作的输出都会变,直接导致预测结果波动。你可以在代码开头加上这段:import numpy as np import tensorflow as tf import random # 固定numpy的随机种子 np.random.seed(42) # 固定Python原生随机模块的种子 random.seed(42) # 固定TensorFlow的全局随机种子 tf.random.set_seed(42) # 要是用的是TensorFlow 2.0以下的版本,还得加这句: # tf.set_random_seed(42)预测时还在做数据增强
你训练时用ImageDataGenerator加了各种数据增强(比如随机翻转、缩放、旋转)来提升模型泛化能力,但如果预测阶段的生成器还保留这些随机增强操作,那每次输入模型的测试切片都会被随机修改,结果当然不一样!预测时一定要把生成器改成只做归一化,关掉所有随机增强:# 预测用的生成器,只保留归一化,去掉所有随机增强 test_datagen = ImageDataGenerator(rescale=1./255)Dropout/BatchNorm层没切换到推理模式
要是你的模型里有Dropout或者BatchNormalization层,训练和推理阶段的行为是不一样的——训练时Dropout会随机丢弃神经元,BatchNorm会用当前批次的均值方差;但推理时需要固定这些参数。虽然Keras的predict方法默认会自动切换模式,但有时候加载模型后如果有自定义操作,可能会出问题。保险起见,加载模型后可以手动设置:model = tf.keras.models.load_model('your_trained_model.h5') model.trainable = False # 强制模型进入推理模式 # 旧版Keras可以用这句:tf.keras.backend.set_learning_phase(0)模型保存/加载的兼容性问题
h5格式虽然方便,但如果训练和预测环境的TensorFlow/Keras版本不一致,可能会导致模型权重或结构加载异常,间接引发预测结果不稳定。建议你检查两边的环境版本是否一致,或者改用TensorFlow官方推荐的SavedModel格式保存(稳定性更强):# 保存为SavedModel格式 model.save('your_saved_model_dir') # 加载模型 model = tf.keras.models.load_model('your_saved_model_dir')测试数据加载时开启了打乱
如果你用flow_from_directory加载测试数据时设置了shuffle=True,那每次加载的样本顺序都会变。虽然单个样本的预测结果应该一致,但如果后续有批量统计或者可视化操作,看起来就像是结果“随机”了。预测时一定要把shuffle设为False:test_generator = test_datagen.flow_from_directory( 'your_test_data_path', target_size=(256, 256), batch_size=32, shuffle=False # 固定样本顺序,确保每次输入一致 )
内容的提问来源于stack exchange,提问作者Borealis

