【问题标题】:Tesnorflow 2.0 tf.random.set_seed not working since I am getting different resultsTensorflow 2.0 tf.random.set_seed 不工作,因为我得到不同的结果
【发布时间】:2020-02-04 13:35:03
【问题描述】:

我使用 tf.random.set_seed 来确保我的实验的可重复性,但在多次训练我的模型后得到不同的损失结果。我正在使用 Tensorboard 监控每个实验的学习曲线,但我得到了不同的损失值和准确率。

【问题讨论】:

  • 我相信你必须重置内核进行测试。如果你按顺序做事,第二次可能不等于第一次。
  • 您也可以尝试设置 numpy 种子,也可以将种子直接传递给使用随机值的层/方法。
  • 感谢@DanielMöller。现在可以了。
  • 你好@Khalil Mlayhi。我尝试设置 numpy 种子,但它不固定。你能告诉我你的最终解决方案吗?

标签: python tensorflow keras tensorflow2.0


【解决方案1】:

在此处(回答部分)提供解决方案,即使它出现在评论部分中,也是为了社区的利益。

要重现相同的结果,您可以创建如下函数并将种子直接传递到 cmets 中 Daniel 提到的层。

def reset_random_seeds():
   os.environ['PYTHONHASHSEED']=str(2)
   tf.random.set_seed(2)
   np.random.seed(2)
   random.seed(2)

请参考下面的完整代码,它重现了相同的结果

import os
####*IMPORANT*: Have to do this line *before* importing tensorflow
os.environ['PYTHONHASHSEED']=str(2)

import tensorflow as tf
import tensorflow.keras as keras
import tensorflow.keras.layers 
import random
import pandas as pd
import numpy as np

def reset_random_seeds():
   os.environ['PYTHONHASHSEED']=str(2)
   tf.random.set_seed(2)
   np.random.seed(2)
   random.seed(2)

#make some random data
reset_random_seeds()
NUM_ROWS = 1000
NUM_FEATURES = 10
random_data = np.random.normal(size=(NUM_ROWS, NUM_FEATURES))
df = pd.DataFrame(data=random_data, columns=['x_' + str(ii) for ii in range(NUM_FEATURES)])
y = df.sum(axis=1) + np.random.normal(size=(NUM_ROWS))

def run(x, y):
    reset_random_seeds()

    model = keras.Sequential([
            keras.layers.Dense(40, input_dim=df.shape[1], activation='relu'),
            keras.layers.Dense(20, activation='relu'),
            keras.layers.Dense(10, activation='relu'),
            keras.layers.Dense(1, activation='linear')
        ])
    NUM_EPOCHS = 100
    model.compile(optimizer='adam', loss='mean_squared_error')
    model.fit(x, y, epochs=NUM_EPOCHS, verbose=0)
    predictions = model.predict(x).flatten()
    loss = model.evaluate(x,  y) #This prints out the loss by side-effect

#With Tensorflow 2.0 this is now reproducible! 
run(df, y)
run(df, y)
run(df, y)

输出:

32/32 [==============================] - 0s 2ms/step - loss: 0.5633
32/32 [==============================] - 0s 2ms/step - loss: 0.5633
32/32 [==============================] - 0s 2ms/step - loss: 0.5633

【讨论】:

  • @Khalil Mlayhi,如果它回答了您的问题,请您接受并投票赞成。谢谢
【解决方案2】:

对于 tensorflow 2,请改用 tf.random.set_seed(seed)

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多