我目前正在研究张量流模型,并遇到了有关其再现性的问题。
我构建了一个简单的密集模型,使用常量值初始化并使用虚拟数据进行训练。
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 都将无效,因为只剩下一批。
因此,在
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()
会显着降低速度。更深层次的原因是,硬件为了加快计算速度而降低了一些精度,这通常不会影响我们的算法。除了深度学习之外,模型非常庞大,容易产生误差,而且训练周期很长,导致误差累积。如果在回归模型中,任何额外的误差都是不可接受的,所以在这种情况下我们需要确定性算法。