如何获得可重现的结果(Keras、Tensorflow):
How to Get Reproducible Results (Keras, Tensorflow):
为了使结果可重现,我已经阅读了 20 多篇文章,并在我的脚本中添加了最多的功能……但都失败了。
在我红色的官方源中有两种种子——全局的和可操作的。可能是,解决我的问题的关键是设置操作种子,但我不知道在哪里应用它。
你能帮我用tensorflow(版本> 2.0)实现可重现的结果吗?非常感谢。
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
import pandas as pd
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from keras.optimizers import adam
from sklearn.preprocessing import MinMaxScaler
np.random.seed(7)
import tensorflow as tf
tf.random.set_seed(7) #analogue of set_random_seed(seed_value)
import random
random.seed(7)
tf.random.uniform([1], seed=1)
tf.Graph.as_default #analogue of tf.get_default_graph().finalize()
rng = tf.random.experimental.Generator.from_seed(1234)
rng.uniform((), 5, 10, tf.int64) # draw a random scalar (0-D tensor) between 5 and 10
df = pd.read_csv("s54.csv",
delimiter = ';',
decimal=',',
dtype = object).apply(pd.to_numeric).fillna(0)
#data normalization
scaler = MinMaxScaler()
scaled_values = scaler.fit_transform(df)
df.loc[:,:] = scaled_values
X_train, X_test, y_train, y_test = train_test_split(df.iloc[:,1:],
df.iloc[:,:1],
test_size=0.2,
random_state=7,
stratify = df.iloc[:,:1])
model = Sequential()
model.add(Dense(1200, input_dim=len(X_train.columns), activation='relu'))
model.add(Dense(150, activation='relu'))
model.add(Dense(80, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
loss="binary_crossentropy"
optimizer=adam(lr=0.01)
metrics=['accuracy']
epochs = 2
batch_size = 32
verbose = 0
model.compile(loss=loss,
optimizer=optimizer,
metrics=metrics)
model.fit(X_train, y_train, epochs = epochs, batch_size=batch_size, verbose = verbose)
predictions = model.predict(X_test)
tn, fp, fn, tp = confusion_matrix(y_test, predictions>.5).ravel()
作为文档的参考
依赖于随机种子的操作实际上是从两个种子派生出来的:全局种子和操作级种子。这设置了全局种子。
它与操作级种子的交互如下:
- 如果全局种子和操作种子均未设置:随机选择的种子用于此操作。
- 如果未设置操作种子但设置了全局种子:系统从全局种子确定的种子流中选择一个操作种子。
- 如果设置了操作种子,但未设置全局种子:默认的全局种子和指定的操作种子来确定随机序列。
- 如果同时设置了全局种子和操作种子:两个种子结合使用来确定随机序列。
第一个场景
默认选择随机种子。结果很容易注意到这一点。
每次重新运行程序或多次调用代码都会有不同的值。
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
print(x_train)
第二个场景
设置了全局但未设置操作。
尽管它生成了与第一和第二随机不同的种子。如果重新运行或者重启代码。两者的种子仍然相同。
它一遍又一遍地产生相同的结果。
tf.random.set_seed(2)
first = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
print(first)
sec = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
print(sec)
第三个场景
对于这种情况,设置了操作种子而不是全局种子。
如果您重新 运行 代码,它会给您不同的结果,但是如果您重新启动 运行time if 将会给您与之前 运行.[=16= 相同的结果序列]
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32, seed=2)
print(x_train)
第四个场景
两个种子都将用于确定随机序列。
更改全局和操作种子会产生不同的结果,但使用相同的种子重新启动 运行time 仍会产生相同的结果。
tf.random.set_seed(3)
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32, seed=1)
print(x_train)
创建了一个可重现的代码作为参考。
通过设置全局种子,它总是给出相同的结果。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
import pandas as pd
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
## GLOBAL SEED ##
tf.random.set_seed(3)
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
y_train = tf.math.sin(x_train)
x_test = tf.random.normal((10,1), 2, 3, dtype=tf.float32)
y_test = tf.math.sin(x_test)
model = Sequential()
model.add(Dense(1200, input_shape=(1,), activation='relu'))
model.add(Dense(150, activation='relu'))
model.add(Dense(80, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
loss="binary_crossentropy"
optimizer=tf.keras.optimizers.Adam(lr=0.01)
metrics=['mse']
epochs = 5
batch_size = 32
verbose = 1
model.compile(loss=loss,
optimizer=optimizer,
metrics=metrics)
histpry = model.fit(x_train, y_train, epochs = epochs, batch_size=batch_size, verbose = verbose)
predictions = model.predict(x_test)
print(predictions)
注意:如果你使用的是更高版本的TensorFlow 2,Keras已经在API,所以,你应该使用TF.Keras而不是原生的。
所有这些都是在API上模拟的google 协作。
当我们使用层 >= 3 和神经元 >= 100 时,处理器核心的数量是有意义的。我的问题是 运行 2 个不同服务器上的脚本:
-32核
-16核
当我 运行 在具有 32 个内核(甚至是 32 和 24 个内核)的服务器上运行脚本时,结果是相同的。
从 TensorFlow 2.8 开始,有 tf.config.experimental.enable_op_determinism()
。
即使在 GPU 上,您也可以通过
确保再现性
import tensorflow as tf
tf.keras.utils.set_random_seed(42) # sets seeds for base-python, numpy and tf
tf.config.experimental.enable_op_determinism()
为了使结果可重现,我已经阅读了 20 多篇文章,并在我的脚本中添加了最多的功能……但都失败了。
在我红色的官方源中有两种种子——全局的和可操作的。可能是,解决我的问题的关键是设置操作种子,但我不知道在哪里应用它。
你能帮我用tensorflow(版本> 2.0)实现可重现的结果吗?非常感谢。
from keras.models import Sequential
from keras.layers import Dense
import numpy as np
import pandas as pd
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from keras.optimizers import adam
from sklearn.preprocessing import MinMaxScaler
np.random.seed(7)
import tensorflow as tf
tf.random.set_seed(7) #analogue of set_random_seed(seed_value)
import random
random.seed(7)
tf.random.uniform([1], seed=1)
tf.Graph.as_default #analogue of tf.get_default_graph().finalize()
rng = tf.random.experimental.Generator.from_seed(1234)
rng.uniform((), 5, 10, tf.int64) # draw a random scalar (0-D tensor) between 5 and 10
df = pd.read_csv("s54.csv",
delimiter = ';',
decimal=',',
dtype = object).apply(pd.to_numeric).fillna(0)
#data normalization
scaler = MinMaxScaler()
scaled_values = scaler.fit_transform(df)
df.loc[:,:] = scaled_values
X_train, X_test, y_train, y_test = train_test_split(df.iloc[:,1:],
df.iloc[:,:1],
test_size=0.2,
random_state=7,
stratify = df.iloc[:,:1])
model = Sequential()
model.add(Dense(1200, input_dim=len(X_train.columns), activation='relu'))
model.add(Dense(150, activation='relu'))
model.add(Dense(80, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
loss="binary_crossentropy"
optimizer=adam(lr=0.01)
metrics=['accuracy']
epochs = 2
batch_size = 32
verbose = 0
model.compile(loss=loss,
optimizer=optimizer,
metrics=metrics)
model.fit(X_train, y_train, epochs = epochs, batch_size=batch_size, verbose = verbose)
predictions = model.predict(X_test)
tn, fp, fn, tp = confusion_matrix(y_test, predictions>.5).ravel()
作为文档的参考
依赖于随机种子的操作实际上是从两个种子派生出来的:全局种子和操作级种子。这设置了全局种子。
它与操作级种子的交互如下:
- 如果全局种子和操作种子均未设置:随机选择的种子用于此操作。
- 如果未设置操作种子但设置了全局种子:系统从全局种子确定的种子流中选择一个操作种子。
- 如果设置了操作种子,但未设置全局种子:默认的全局种子和指定的操作种子来确定随机序列。
- 如果同时设置了全局种子和操作种子:两个种子结合使用来确定随机序列。
第一个场景
默认选择随机种子。结果很容易注意到这一点。 每次重新运行程序或多次调用代码都会有不同的值。
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
print(x_train)
第二个场景
设置了全局但未设置操作。 尽管它生成了与第一和第二随机不同的种子。如果重新运行或者重启代码。两者的种子仍然相同。 它一遍又一遍地产生相同的结果。
tf.random.set_seed(2)
first = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
print(first)
sec = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
print(sec)
第三个场景
对于这种情况,设置了操作种子而不是全局种子。 如果您重新 运行 代码,它会给您不同的结果,但是如果您重新启动 运行time if 将会给您与之前 运行.[=16= 相同的结果序列]
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32, seed=2)
print(x_train)
第四个场景
两个种子都将用于确定随机序列。 更改全局和操作种子会产生不同的结果,但使用相同的种子重新启动 运行time 仍会产生相同的结果。
tf.random.set_seed(3)
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32, seed=1)
print(x_train)
创建了一个可重现的代码作为参考。
通过设置全局种子,它总是给出相同的结果。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
import numpy as np
import pandas as pd
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
## GLOBAL SEED ##
tf.random.set_seed(3)
x_train = tf.random.normal((10,1), 1, 1, dtype=tf.float32)
y_train = tf.math.sin(x_train)
x_test = tf.random.normal((10,1), 2, 3, dtype=tf.float32)
y_test = tf.math.sin(x_test)
model = Sequential()
model.add(Dense(1200, input_shape=(1,), activation='relu'))
model.add(Dense(150, activation='relu'))
model.add(Dense(80, activation='relu'))
model.add(Dense(10, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
loss="binary_crossentropy"
optimizer=tf.keras.optimizers.Adam(lr=0.01)
metrics=['mse']
epochs = 5
batch_size = 32
verbose = 1
model.compile(loss=loss,
optimizer=optimizer,
metrics=metrics)
histpry = model.fit(x_train, y_train, epochs = epochs, batch_size=batch_size, verbose = verbose)
predictions = model.predict(x_test)
print(predictions)
注意:如果你使用的是更高版本的TensorFlow 2,Keras已经在API,所以,你应该使用TF.Keras而不是原生的。
所有这些都是在API上模拟的google 协作。
当我们使用层 >= 3 和神经元 >= 100 时,处理器核心的数量是有意义的。我的问题是 运行 2 个不同服务器上的脚本:
-32核
-16核
当我 运行 在具有 32 个内核(甚至是 32 和 24 个内核)的服务器上运行脚本时,结果是相同的。
从 TensorFlow 2.8 开始,有 tf.config.experimental.enable_op_determinism()
。
即使在 GPU 上,您也可以通过
确保再现性import tensorflow as tf
tf.keras.utils.set_random_seed(42) # sets seeds for base-python, numpy and tf
tf.config.experimental.enable_op_determinism()