python - 如何保证神经网络性能的可比性?
问题描述
对于我的论文,我正在尝试使用 tensorflow(v 1.14)评估不同参数对我的主动学习对象检测器的影响。
因此,我使用模型动物园中的 faster_rcnn_inception_v2_coco 标准配置和固定的 random.seed(1)。
为了确保我有一个有效的基线实验,我尝试使用相同的数据集、学习时间、池大小等运行对象检测器两次。
无论如何,在 20 个主动学习周期之后绘制的两个图表完全不同,正如您在此处看到的那样: 是否有可能确保具有可比性的神经网络性能?如果是,如何设置科学实验设置,比较参数变化结果,如学习率、学习时间(这是我们主动学习周期中的一个约束!) poolingsize,...
解决方案
为了在 CPU 上进行训练时实现确定性,以下内容就足够了:
1. 设置所有种子
SEED = 123
os.environ['PYTHONHASHSEED']=str(SEED)
random.seed(SEED)
np.random.seed(SEED)
tf.set_random_seed(SEED)
2. 将 CPU 线程限制为一个
session_config.intra_op_parallelism_threads = 1
session_config.inter_op_parallelism_threads = 1
3. 数据集分片
如果您正在使用tf.data.Dataset
,请确保分片数量限制为一个。
4. 梯度选通
gate_gradients=tf.train.Optimizer.GATE_OP
对于确定性功能,会话配置中可能需要某些类型的模型。
5. 霍罗沃德
如果您使用 Horovod 使用两个以上的 GPU 进行训练,就像这样,
os.environ['HOROVOD_FUSION_THRESHOLD']='0'
为了更清楚地检查运行之间的确定性,我推荐使用我在此处记录的方法。我还建议使用这种方法来确认初始权重(在训练的第一步之前)在运行之间完全相同。
有关 TensorFlow 中确定性的最新信息(重点关注使用 GPU 时的确定性),请查看 NVIDIA 支付给我推动的tensorflow-determinism项目。
推荐阅读
- ggplot2 - 双geom_bar,如何获取每个条的值
- c++ - 使用 MCU 在 C 中解析 HTTP 数据
- c# - 自定义 TaskFactory 不使用自定义 SynchronizationContext
- android - enoent 文件打开失败&解决方法 InputStream
- java - 用 2 个锚点 ARCore 之间的方向渲染箭头
- javascript - 如何在不同的 HTML 脚本类中引用 javascript 类?
- opengl - 了解图像抖动以及它们如何帮助混合 CSM
- javascript - 如何将函数返回值传递给 Node.js 中的对象
- sql-server - VBA:使用连接表时,sql查询中的对象已关闭错误
- c# - 如何删除从 Web 应用程序发送的电子邮件的 base64 编码