预训练InceptionV3 CNN推理结果随机的问题求助
解决InceptionV3推理结果随机的问题
你这情况我太熟了——之前用预训练CNN做推理时也踩过一模一样的坑!核心问题其实出在模型构建时的一个参数设置上,咱们一步步来解决:
问题根源:训练模式没关掉
你在调用inception_v3的时候,把is_training参数设成了True,这就导致模型里的Dropout和**批量归一化(BatchNorm)**一直处于训练状态:
- Dropout会随机丢弃部分神经元,每次推理丢的都不一样,结果自然随机;
- BatchNorm会用当前输入批次的均值/方差计算,而不是预训练好的移动均值/方差,也会带来随机性。
快速修复步骤
1. 把is_training改成False
修改模型构建的代码,把True换成False:
logits, endpoints = nn_architecture.inception_v3(input, # input 1001, #NUM_CLASSES, #num classes False, # 这里改成False!关闭训练模式 0.8, # dropout keep rate 16, # min depth 1.0, # depth multiplayer layers_lib.softmax, # prediction function True, # spatial squeeze tf.AUTO_REUSE, # reuse, use get variable to get variables directly... probably 'InceptionV3') # scope
当is_training=False时,Dropout会完全关闭(保留所有神经元),BatchNorm会自动切换到推理模式,使用预训练好的统计量,这样每次推理结果就一致了。
2. 可选:检查图片预处理是否标准
另外,你的图片缩放方式可能需要调整——InceptionV3官方要求输入像素值范围是[-1, 1],而skimage.zoom处理后可能是[0,1]的浮点数,这会影响模型输出。你可以调整预处理代码:
from skimage import io, transform car = io.imread("data/car.jpg") # 缩放后转成[0,255]的整数,再归一化到[-1,1] car_scaled = transform.resize(car, (299, 299), mode='reflect') * 255 car_scaled = car_scaled - 127.5 car_scaled = car_scaled * 0.0078125 car_cnnable = np.array([car_scaled])
这一步不是导致随机性的直接原因,但能让你的输入更符合模型的训练预期,提升分类准确率。
3. 验证检查点加载是否正常
你已经用updates_collections=None解决了模型和检查点不匹配的问题,这一步是对的。可以在加载检查点后,打印一个权重变量的值(比如某个卷积层的权重),确认每次运行脚本时加载的权重都是一样的,确保检查点确实正确加载。
测试效果
修改后再运行脚本,不管是多次执行还是同一次执行多次推理,结果都会完全一致啦!
内容的提问来源于stack exchange,提问作者Syzygy
相关产品推荐
相关产品推荐

