keras 为tensorflow设置种子无法获得可重现的结果

nimxete2  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(209)

我在Google Colab中运行了一个顺序模型。我尝试了所有可以找到的关于设置种子的建议,这样我就可以得到可重复的结果,但没有任何效果。训练和验证准确性每次都不同,训练和验证损失也是如此。
有关我的项目的更多信息:

  • tensorflow 版本:2.9.2
  • 我已经支付了ColabPro版本,如果这件事。

因为我正在预处理文本数据,所以我执行以下操作:

# Pad tokens (X var)   
tokens = data_sent['word_idx'].tolist()

maxlen = config.MAX_LEN #max([len(s) for s in tokens])

pad_tokens = pad_sequences(tokens, maxlen=maxlen, dtype='int32', padding='post')

下面是我用来分割数据的函数:

def data_split(features, labels, train_frac, random_state=config.SEED):
  assert train_frac >= 0 and train_frac <= 1, "Invalid training set fraction"

  X_train, X_test, Y_train, Y_test = train_test_split(
      features, labels, train_size=train_frac, random_state=random_state)

  print(
    'train_tokens length:', len(X_train),
    '\ntest_tokens length:', len(X_test),
    '\ntrain_tags:', len(Y_train),
    '\ntest_tags:', len(Y_test),
    )

  return X_train, X_test,  Y_train, Y_test

产品型号:

model = tf.keras.models.Sequential([
    tf.keras.layers.Embedding(input_dim=config.MAX_TOKENS, output_dim=config.EMBEDDING_DIM, input_length=config.MAX_LEN, mask_zero=True),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(units=config.EMBEDDING_DIM, activation='tanh', return_sequences=True, dropout=0.2, kernel_regularizer=regularizers.L2(l2_regularizer_start), kernel_initializer=tf.keras.initializers.glorot_uniform(seed=config.SEED))),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(units=config.EMBEDDING_DIM, activation='tanh', return_sequences=True, dropout=0.2, kernel_regularizer=regularizers.L2(l2_regularizer_start), kernel_initializer=tf.keras.initializers.glorot_uniform(seed=config.SEED))),
    tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(units=config.EMBEDDING_DIM, activation='tanh', return_sequences=True, dropout=0.2, kernel_regularizer=regularizers.L2(l2_regularizer_start), kernel_initializer=tf.keras.initializers.glorot_uniform(seed=config.SEED))),
    tf.keras.layers.TimeDistributed(tf.keras.layers.Dense(n_tags, activation='softmax', kernel_initializer=tf.keras.initializers.glorot_uniform(seed=config.SEED))),
])

我尝试过的方法:1.为每一层中的初始化程序设置种子:

kernel_initializer=tf.keras.initializers.glorot_uniform(seed=config.SEED)

2.在代码v0的开头

np.random.seed(config.SEED)
random.seed(config.SEED)
tf.random.set_seed(config.SEED)

3.在代码v1的开头

random.seed(SEED)
np.random.seed(SEED)
tf.random.set_seed(SEED)
os.environ['PYTHONHASHSEED']=str(SEED)
os.environ['TF_DETERMINISTIC_OPS'] = '1'

4.在代码v2的开头

tf.keras.utils.set_random_seed(config.SEED)
tf.config.experimental.enable_op_determinism()

5.在代码v3的开头

def set_seeds(seed=config.SEED):
    os.environ['PYTHONHASHSEED'] = str(seed)
    random.seed(seed)
    tf.random.set_seed(seed)
    np.random.seed(seed)

def set_global_determinism(seed=config.SEED):
    set_seeds(seed=seed)

    os.environ['TF_DETERMINISTIC_OPS'] = '1'
    os.environ['TF_CUDNN_DETERMINISTIC'] = '1'
    
    tf.config.threading.set_inter_op_parallelism_threads(1)
    tf.config.threading.set_intra_op_parallelism_threads(1)

# Call the above function with seed value
set_global_determinism(seed=config.SEED)

更新:

如果我多次运行笔记本而不重新启动运行时,我会得到相同的结果。
如果我重启Colab运行时,结果(准确度和损失)总是不同,尽管设置了随机种子,并且每次都相同。

更新1

使用!nvidia-smi显示每次我在Colab中重新启动会话时,我连接的GPU都在发生变化。
因此,似乎是Colab造成了这个问题,但我不知道如何解决它。

mccptt67

mccptt671#

从问题中,你可以使用随机数发生器。
样本:随机的统一值。预期没有来自测定输入的序列输出,准确度不同,没有测定成分。

for image in list_file:
    
        g = tf.random.Generator.from_seed(1234)
        g.reset_from_seed( 1235 + icount )
        temp = tf.random.uniform( shape=(4, 1), minval=0, maxval=6, dtype=tf.dtypes.int64,seed=1235 + icount,name="random" )
        arg = tf.math.argmax( temp ).numpy()[0]
        result = temp[arg].numpy()[0]
        icount = icount + 1

输出量:

3
4
3
3
4
3
5
4
5
4

相关问题