我试图在keras中同一脚本的多次运行之间获得可重复的结果,但我在每次迭代中得到不同的结果。我的代码是这样的:
import numpy as np
from numpy.random import seed
import random as rn
import os
seed_num = 1
os.environ['TF_CUDNN_DETERMINISTIC'] = '1'
os.environ['PYTHONHASHSEED'] = '1'
os.environ['TF_DETERMINISTIC_OPS'] = '1'
np.random.seed(seed_num)
rn.seed(seed_num)
import tensorflow as tf
tf.random.set_seed(seed_num)
import tensorflow.keras as ks
from tensorflow.python.keras import backend as K
...some imports...
from tensorflow.keras.preprocessing.image import ImageDataGenerator
.... data loading etc ....
generator = ImageDataGenerator(
width_shift_range=0.1,
height_shift_range=0.1,
horizontal_flip=True)
generator.fit(X_train, seed=seed_num)
my_model.fit(generator.flow(X_train, y_train, batch_size=batch_size, shuffle=False, seed=seed_num), validation_data=(X_val, y_val), callbacks=callbacks , epochs=epochs, shuffle=False)
我确定问题在ImageDataGenerator
中,即,当设置generator = ImageDataGenerator()
而不进行任何增强时,结果是可重复的。我也在CPU上运行,TensorFlow版本是2.4.1。我遗漏了什么?
在创建增强图像时使用GPU会产生不确定的结果。
使用ImageDataGenerator获得可重复的结果和GPU,一种方法如下:
import random, os
import numpy as np
import tensorflow as tf
def set_seed(seed=0):
np.random.seed(seed)
tf.random.set_seed(seed)
random.seed(seed)
os.environ['TF_DETERMINISTIC_OPS'] = "1"
os.environ['TF_CUDNN_DETERMINISM'] = "1"
os.environ['PYTHONHASHSEED'] = str(seed)
set_seed()
Beforemodel.fit()
call againset_seed()
:
set_seed()
model.fit(...)
否则,你可以安装包tensorflow-determinism:
pip install tensorflow-determinism
如果你正在使用Google Colab,重新启动你的运行时,否则它可能无法工作
该包将与GPU交互以产生确定性结果。
import random, os
import numpy as np
import tensorflow as tf
def set_seed(seed=0):
os.environ['TF_DETERMINISTIC_OPS'] = '1'
random.seed(seed)
np.random.seed(seed)
tf.random.set_seed(seed)
set_seed()
# code
同样在这种情况下,在model.fit()
再次调用set_seed()
之前:
set_seed()
model.fit(...)