关于 Tensorflow 模型再现性的问题

Question about Tensorflow Model Reproducibility

我目前正在研究 tensorflow 模型,但遇到了关于其再现性的问题。

我构建了一个简单的 Dense 模型,该模型使用常量值进行初始化并使用虚拟数据进行训练。

import tensorflow as tf
weight_init = tf.keras.initializers.Constant(value=0.001)

inputs = tf.keras.Input(shape=(5,))
layer1 = tf.keras.layers.Dense(5, 
                           activation=tf.nn.leaky_relu,
                           kernel_initializer=weight_init,
                           bias_initializer=weight_init)
outputs = layer1(inputs)
model = tf.keras.Model(inputs=inputs, outputs=outputs, name="test")

model.compile(loss='mse',
               optimizer = 'Adam'
               )
model.fit([[111,1.02,-1.98231,1,1],
      [112,1.02,-1.98231,1,1],
      [113,1.02,-1.98231,1,1],
      [114,1.02,-1.98231,1,1],
      [115,1.02,-1.98231,1,1],
      [116,1.02,-1.98231,1,1],
      [117,1.02,-1.98231,1,1]], 
      
      [1,1,1,1,1,1,2], epochs = 3, batch_size=1)

即使我将模型的初始值设置为 0.001,训练损失也会随着每次尝试而变化....

我在这里错过了什么?是否有任何其他值可供我固定为常量?

更令人惊讶的是,如果我将batch_size更改为16,损失不会随着尝试而改变

拜托..教我...

嗨嗨

由于 keras.model.fit() 具有默认 kwarg shuffle=True,数据将跨批次打乱。如果你把batch_size改成任何大于数据长度的整数,任何shuffle都会无效,因为只剩下一个batch。

所以,在model.fit()中加上shuffle=False,就可以实现这里的可重现性了。

另外,如果你的模型变大了,就会出现真正的可复现性问题,即连续两次计算的结果会有轻微的误差,即使你没有随机或随机播放,只是点击运行, 然后 单击 运行。我们将其绘制为 determinism 以实现可重复性。

Determinism 是一个很好的问题,但通常很容易被许多用户忽略。 让我们从结论开始,即再现性受以下因素影响:

  • 随机种子 (operation_seed+hidden_global_seed)
  • 操作确定性

怎么办? Tensorflow determinism已经明确声明,即在构建或恢复模型之前添加以下代码。

tf.keras.utils.set_random_seed(some_seed)
tf.config.experimental.enable_op_determinism()

但是只有当你非常依赖可重复性时才可以使用它,因为tf.config.experimental.enable_op_determinism()会显着降低速度。更深层次的原因是,硬件为了加快计算速度降低了一些精度,这通常不会影响我们的算法。除了在深度学习中,模型非常大,容易出现错误,而且训练周期很长,导致错误累积。如果在回归模型中,任何额外的错误都是不可接受的,所以在这种情况下我们需要确定性算法。