关于 Tensorflow 模型再现性的问题

问题描述 投票:0回答:1

我目前正在研究张量流模型,并遇到了有关其再现性的问题。

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

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,损失不会随着尝试而改变

请..教我...

tensorflow2.0 loss-function loss
1个回答
1
投票

由于

keras.model.fit()
有默认的 kwarg
shuffle=True
,数据将跨批次进行混洗。如果将
batch_size
更改为任何大于数据长度的整数,则任何 shuffle 都将无效,因为只剩下一批。

因此,在

shuffle=False
中添加
model.fit()
将在此处实现可重复性。

另外,如果你的模型变大,就会出现真正的重现性问题,即即使你不做随机或洗牌,只是点击运行,连续两次计算的结果也会有轻微的误差 单击运行。为了重现性,我们将其绘制为

determinism

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

  • 随机种子 (
    operation_seed
    +
    hidden_global_seed
    )
  • 操作决定论

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

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

但只有在严重依赖再现性的情况下才可以使用它,因为

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

© www.soinside.com 2019 - 2024. All rights reserved.