无法在keras中使用imagedataggenerator获得可重复的结果



我试图在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(...) 

最新更新