众所周知,Keras 后端使用 Tensorflow,因此当我们在每一层提供相同的参数、超参数、权重和偏差初始化时,它应该会给出某种结果,但准确度仍然不同。
这可能是因为在两个模型的每个步骤中输入的图像批次并不相同,并且会随机打乱。
有什么方法可以确保将同一批图像输入模型,同时消除随机性?
我已经尝试使用所有相同的参数、超参数、相同的权重和带有种子值的偏差初始化。
两种模型的准确度不一样。
众所周知,Keras 后端使用 Tensorflow,因此当我们在每一层提供相同的参数、超参数、权重和偏差初始化时,它应该会给出某种结果,但准确度仍然不同。
这可能是因为在两个模型的每个步骤中输入的图像批次并不相同,并且会随机打乱。
有什么方法可以确保将同一批图像输入模型,同时消除随机性?
我已经尝试使用所有相同的参数、超参数、相同的权重和带有种子值的偏差初始化。
两种模型的准确度不一样。
我创建了一个规则来实现可重复性:
最后在代码中:
import numpy as np
import random as rn
import tensorflow as tf
import keras
from keras import backend as K
#-----------------------------Keras reproducible------------------#
SEED = 1234
tf.set_random_seed(SEED)
os.environ['PYTHONHASHSEED'] = str(SEED)
np.random.seed(SEED)
rn.seed(SEED)
session_conf = tf.ConfigProto(
intra_op_parallelism_threads=1,
inter_op_parallelism_threads=1
)
sess = tf.Session(
graph=tf.get_default_graph(),
config=session_conf
)
K.set_session(sess)
#-----------------------------------------------------------------#
问题不在于您使用的框架,而在于在后台运行的随机数生成器。如果您在运行时拆分验证集,请确保您将随机种子设置为某个特定数字。为了消除随机数生成器的随机性,我们应该设置种子。
您可以使用tf.random.set_seed(seed)变量为 TensorFlow 设置随机种子并赋予它一些值。在pytorch中使用torch.manual_seed(0). 但是当你这样做时,其他依赖如numpy和random也会生成它们自己的随机数,所以你也需要设置它们的种子。您还可以使用以下功能一次设置所有种子。当你运行任何东西时,只需保持一致性检查。
def set_seeds(seed=SEED):
os.environ['PYTHONHASHSEED'] = str(seed)
random.seed(seed)
tf.random.set_seed(seed)
np.random.seed(seed)