关于 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()
会显着降低速度。更深层次的原因是,硬件为了加快计算速度降低了一些精度,这通常不会影响我们的算法。除了在深度学习中,模型非常大,容易出现错误,而且训练周期很长,导致错误累积。如果在回归模型中,任何额外的错误都是不可接受的,所以在这种情况下我们需要确定性算法。
我目前正在研究 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()
会显着降低速度。更深层次的原因是,硬件为了加快计算速度降低了一些精度,这通常不会影响我们的算法。除了在深度学习中,模型非常大,容易出现错误,而且训练周期很长,导致错误累积。如果在回归模型中,任何额外的错误都是不可接受的,所以在这种情况下我们需要确定性算法。